在子文档 MongoDB 中检索数组

Posted

技术标签:

【中文标题】在子文档 MongoDB 中检索数组【英文标题】:Retrieve Array in Subdocument MongoDB 【发布时间】:2016-12-29 06:19:34 【问题描述】:

我有一个类似这样的用户模型结构:

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

我是错误地引用了孩子/父母还是我没有正确检索数组?非常感谢任何帮助!

【问题讨论】:

users.todosDo 后面的逗号实际上在您的代码中吗?如果是,您无意中将doTodos 设置为console.log(),即undefined @Mike 是,但我在从 DB 获取所有“Do”待办事项之前定义了这样的 doTodos:var doTodos = ;。还是你说的不是这个? 【参考方案1】:

我猜你可能想编辑为原始 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],

【讨论】:

@shishab 感谢您的回答,但是当我尝试运行它时,它只是不断加载并且不显示任何内容。但是,我知道该应用程序已到达 console.log,因为它打印出的 doTodos 仍然是一个空数组。 继续加载,因为它没有返回任何内容。更新的答案。确保您在 todosDo 中的数据在 user 集合中。【参考方案2】:

感谢大家的帮助!我的问题是我需要将 post 路由中所有新创建的 todos 推送到 todosDo,这样我就可以在 get 路由中检索它们。现在一切正常!

【讨论】:

以上是关于在子文档 MongoDB 中检索数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在子文档中填充模型实例数组? MongoDB猫鼬

mongodb在子文档数组的数组中获取不同的项目

如何使用python脚本从mongoDB中检索数组中的子文档

如何使用python脚本从mongoDB中检索数组中的子文档

检索每个文档的数组的第二个元素 - MongoDB

如何使用MongoDB过滤子文档中的数组[重复]