MongoDB: findOne возвращает null, но вложенный документ существует в коллекции

#node.js #mongodb

#node.js #mongodb

Вопрос:

Я добавляю пользовательский список в БД. После вызова случайного пользовательского списка пользовательский список создается со списком вложенных документов в БД. Но он показывает, что его вложенный документ в консоли равен null. Мой код ->

Моя схема вложенного документа->

 const toSchema=new mongoose.Schema({
  name:{ type:String,required:true}
});
  

Моя основная схема пользовательского списка ->

 const newSchema=new mongoose.Schema({
  name:String,
  sch:[toSchema]
});
const Work=mongoose.model("work",newSchema);
  

Теперь я добавляю коллекции и показываю их на консоли ->

 app.get("/post/:get",function(req,res){
  var ch=req.params.get;
  const item=new Todo({
    name:ch
  }); 
  const work=new Work({
    name:ch,
    sch:item
  });
  work.save();
  Work.findOne({name:ch},function(err,works){
    if(err){
      console.log(err);
    }
    else{
      console.log(works);
     }
 
});  
});
  

Я набираю пользовательский список «home», и он успешно создан в
db. Но вложенный документ показывает null.

Вывод консоли, который показывал нулевое значение вместо вложенного документа

Здесь создан вложенный документ, который был показан в MongoDB

Пожалуйста, помогите.

Ответ №1:

Это видно, null потому что .save() он асинхронен по своей природе, поэтому вам нужно дождаться завершения его выполнения, прежде чем пытаться find , но если вы просто хотите сохранить find документ, который вы сохраняете, тогда вам не нужно использовать, find поскольку .save() возвращает документ, который вы сохраняете saving

  work.save(function(err, document) {
    if (err)
      console.error(err);
    else
      console.log(document);

  });
  

Но если вы планируете использовать, .find() вам нужно дождаться .save() завершения выполнения

Ответ №2:

Он показывает null, потому что в вашей схеме вы объявили sch как массив и пытаетесь сохранить объект в нем.

   const newSchema=new mongoose.Schema({
  name:String,
  sch:[toSchema] // Declared Array

});
const Work=mongoose.model("work",newSchema);
  

Вот почему он равен null.
Если вы хотите сохранить в нем объект (в вашем случае const item ), то вам нужно объявить sch как объект. Измените свой newSchema , как указано ниже

 const newSchema = new mongoose.Schema({
  name:String,
  sch:{toSchema}
});
const Work=mongoose.model("work",newSchema);
  

Тогда это работает.

Комментарии:

1. Да, теперь я решил свою проблему. Я использовал метод «insertMany» вместо «сохранить», а затем в метод «insertMany» я добавил метод «find» в другую часть метода «insertMany». Спасибо, что помогли мне.