在mongoose中填充嵌套数组

Ant*_*lov 98 mongoose mongodb node.js

如何在示例文档中填充"组件":

  {
    "__v": 1,
    "_id": "5252875356f64d6d28000001",
    "pages": [
      {
        "__v": 1,
        "_id": "5252875a56f64d6d28000002",
        "page": {
          "components": [
            "525287a01877a68528000001"
          ]
        }
      }
    ],
    "author": "Book Author",
    "title": "Book Title"
  }
Run Code Online (Sandbox Code Playgroud)

这是我的JS,我通过Mongoose获取文档:

  Project.findById(id).populate('pages').exec(function(err, project) {
    res.json(project);
  });
Run Code Online (Sandbox Code Playgroud)

Tri*_*Nhu 202

Mongoose 4.5支持这一点

Project.find(query)
  .populate({ 
     path: 'pages',
     populate: {
       path: 'components',
       model: 'Component'
     } 
  })
  .exec(function(err, docs) {});
Run Code Online (Sandbox Code Playgroud)

  • 太棒了 - 太干净了!这是现代和正确的答案.[此处记录](http://mongoosejs.com/docs/populate.html#deep-populate). (7认同)
  • 我很困惑这是如何工作的,因为路径是`pages.$.page.component`而不是`pages.$ .component`.如何查看页面对象? (3认同)

Ant*_*lov 104

这对我行得通:

 Project.find(query)
  .lean()
  .populate({ path: 'pages' })
  .exec(function(err, docs) {

    var options = {
      path: 'pages.components',
      model: 'Component'
    };

    if (err) return res.json(500);
    Project.populate(docs, options, function (err, projects) {
      res.json(projects);
    });
  });
Run Code Online (Sandbox Code Playgroud)

文档:Model.populate

  • "模型:'组件'"非常重要! (9认同)
  • 但是不应该因为当我定义ref时我也定义了模型,这不是真的DRY.无论如何,谢谢,它有效;) (3认同)

nik*_*ong 30

正如其他人所说,Mongoose 4支持这一点.值得注意的是,如果需要,您也可以在一个级别以上进行递归 - 尽管在文档中没有注明:

Project.findOne({name: req.query.name})
    .populate({
        path: 'threads',
        populate: {
            path: 'messages', 
            model: 'Message',
            populate: {
                path: 'user',
                model: 'User'
            }
        }
    })
Run Code Online (Sandbox Code Playgroud)


Sha*_*eed 20

您可以像这样填充多个嵌套文档.

   Project.find(query)
    .populate({ 
      path: 'pages',
      populate: [{
       path: 'components',
       model: 'Component'
      },{
        path: 'AnotherRef',
        model: 'AnotherRef',
        select: 'firstname lastname'
      }] 
   })
   .exec(function(err, docs) {});
Run Code Online (Sandbox Code Playgroud)


小智 12

这是最好的解决方案:

Car
 .find()
 .populate({
   path: 'pages.page.components'
})
Run Code Online (Sandbox Code Playgroud)


Mar*_*oha 9

如果您想更深层次地填充另一个级别,您需要执行以下操作:

Airlines.findById(id)
      .populate({
        path: 'flights',
        populate:[
          {
            path: 'planeType',
            model: 'Plane'
          },
          {
          path: 'destination',
          model: 'Location',
          populate: { // deeper
            path: 'state',
            model: 'State',
            populate: { // even deeper
              path: 'region',
              model: 'Region'
            }
          }
        }]
      })
Run Code Online (Sandbox Code Playgroud)