在Subdocument MongoDB中检索数组

时间:2016-08-22 15:56:17

标签: node.js mongodb express mongoose subdocument

我的用户模型结构有点像这样:

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

  todosDo: [models.Do.schema],
}

孩子"做"架构有点像这样(在不同的文件中):

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();
    }
  });  

我是否引用了孩子/家长的错误,或者我只是没有检索到该阵列?非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

到目前为止,我猜您可能希望编辑为原始js对象,因此您需要使用lean()函数。不使用lean()函数用户是mongoose对象,因此您无法修改它。

可以试试这个:

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 );
<{1>}文件中的

user.js

答案 1 :(得分:0)

感谢大家的帮助!我的问题是我需要将后期路线中所有新创建的待办事项推送到todosDo,然后我可以在获取路线上检索它们。一切都在现在!