Получить массив в поддокументе MongoDB

У меня есть структура модели Users примерно так:

const userSchema = new mongoose.Schema({
  email: { type: String, unique: true },
  password: String,

  todosDo: [models.Do.schema],
}

И дочерняя схема "Do" примерно такая (в другом файле):

const doSchema = new mongoose.Schema({
  name: {type: String, default : ''},
  user: {type: mongoose.Schema.ObjectId, ref: 'User'},
  createdAt: {type : Date, default : Date.now}
});

И я пытаюсь выяснить, как получить массив todosDo для вошедшего в систему пользователя. Это то, что у меня есть до сих пор:

// Get all "Do" todos from DB
// Experimenting to find todos from certain user
  User.findById(req.user.id, function(err, user){
    if(err){
        console.log(err);
    } else {
      doTodos = user.todosDo, // this obviously doesn't work, just an idea of what I was going for
      console.log(doTodos); 
      finished();
    }
  });  

Я неправильно ссылаюсь на дочерний/родительский элемент или просто неправильно получаю массив? Любая помощь приветствуется!


person Shristi Sharma    schedule 22.08.2016    source источник
comment
Эта запятая после users.todosDo действительно в вашем коде? Если это так, вы непреднамеренно установили doTodos на console.log(), что равно undefined.   -  person Mike    schedule 22.08.2016
comment
@Mike Это так, но я определил doTodos следующим образом: var doTodos = {}; перед тем, как получить все Do Todos из БД. Или это не то, что вы имеете в виду?   -  person Shristi Sharma    schedule 22.08.2016


Ответы (2)


Насколько я думаю, вы можете редактировать как необработанные объекты js, поэтому вам нужно использовать функцию lean(). без использования функции lean() user является объектом мангуста, поэтому вы не можете его изменить.

можно попробовать этот:

User.findById(req.user.id)
  .lean()
  .exec(function (err, user) {
    if(err){
      console.log(err);
      return res.status(400).send({msg:'Error occurred'});
    } 
    if(!user) {
      return res.status(400).send({msg:'User Not found'});
    }

    doTodos = user.todosDo;
    console.log(user.todosDo); // check original todos
    console.log(doTodos);
    return res.status(200).send({doTodos : doTodos }); // return doTodos 

  });

и чтобы сослаться на дочернюю схему в родительскую схему из другой модели, вы можете получить доступ к схеме модели через ее свойство schema.

сказать в doSchema.js файле

const doSchema = new mongoose.Schema({
  name: {type: String, default : ''},
  user: {type: mongoose.Schema.ObjectId, ref: 'User'},
  createdAt: {type : Date, default : Date.now}
});
module.exports = mongoose.model( 'DoSchema', doSchema );

в user.js файле

var DoModel = require('./doSchema');// exact path
const userSchema = new mongoose.Schema({
  email: { type: String, unique: true },
  password: String,

  todosDo: [DoModel.schema],
}
person Shaishab Roy    schedule 23.08.2016
comment
@shishab Спасибо за ответ, но когда я пытаюсь запустить его, он просто продолжает загружаться и ничего не отображает. Но я знаю, что приложение попало в console.log, потому что оно распечатывает doTodos, который все еще является пустым массивом. - person Shristi Sharma; 24.08.2016
comment
продолжает загружаться, потому что ничего не возвращает. обновленный ответ. Убедитесь, что у вас есть данные в todosDo коллекции user. - person Shaishab Roy; 24.08.2016

Спасибо за вашу помощь всем! Моя проблема заключалась в том, что мне нужно было отправить все вновь созданные задачи в маршруте публикации в todosDo, чтобы затем я мог получить их в маршруте получения. Теперь все работает!

person Shristi Sharma    schedule 26.08.2016