猫鼬 - 如何限制populate()级别的深度?

时间:2013-06-26 22:41:25

标签: node.js mongodb mongoose populate

我有两个模式:

var categorySchema = mongoose.Schema({
    title: String,
    blogs: [{ type: ObjectId, ref: 'Blog' }]
})

var blogSchema = mongoose.Schema({
    title: String,
    description: String,
    category: [{ type: ObjectId, ref: 'Category' }],
    created: {type: Number, default: new Date().getTime()}
})

var Category = mongoose.model('Category', categorySchema)
var Blog = mongoose.model('Blog', blogSchema)

他们是交叉引用:

  1. Blog对象包含一组Category个对象(refs),以便能够获取此博客所涉及的所有类别。
  2. Category对象包含一个Blog个对象(refs)数组,以便能够获取此类别的所有博客。
  3. 问题是当我尝试获得某个博客时。我需要填充类别数组来获取它的标题:

    Blog
        .findOne({_id: _._id})
        .populate('category')
        .exec(function (err, __) {
            callback(err, __);
        })
    

    我明白了......

    { title: 'My Blog',
      description: 'description',,
      _id: 51cb6bd845ba145e02000001,
      __v: 0,
      created: 1372285906662,
      category: 
       [ { __v: 0,
           _id: 51cb5ed6fd63867905000002,
           priority: 3,
           title: 'Music',
           blogs: [Object] } ],
    }
    

    是的,我获得了类别标题,但我也在博客中获得了一些对象 - 它们也被填充了。但Blog-objects可能包含很多子对象(帖子),我们还记得category字段。那么,类别字段中的所有对象都将以递归方式填充,因为我在Blog和Category之间有交叉链接,它将在循环中填充?

    如何限制人口水平?我不想要填充博客/类别[n] / blogs: [],只需要直接category字段,例如title。感谢。

1 个答案:

答案 0 :(得分:2)

来自mongoose docs

  

值得商榷的是,我们确实需要两组指针   不同步。相反,我们可以跳过填充并直接找到()   我们感兴趣的故事。

我会删除类别架构中的博客引用,只查询您感兴趣的文档。

“Blog对象包含一个Category对象(refs)数组,以便能够获取此博客与之相关的所有类别”:

Blog.findOne({_id: blogId})
    .populate('category')
    .exec(function (err, blog) {
        callback(err, blog);
        //blog.category is the array you want
    })

“类别对象包含一组Blog对象(refs),以便能够获取此类别的所有博客”:

Blog.find({category: catId}) 
    .exec(function (err, blogs) {
        callback(err, blogs);                        
    })

这是$all query的简化语法,它实际在类别数组中搜索指定的id。