【问题标题】:Mongoose – how to limit depth of populate() level?Mongoose – 如何限制 populate() 级别的深度?
【发布时间】:2013-06-24 06:39:46
【问题描述】:

我有两个架构:

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. 博客对象包含一组Category 对象(参考),以便能够获取与此博客相关的所有类别。
  2. Category 对象包含Blog 对象(refs)数组,以便能够获取该类别的所有博客。

问题是当我尝试获取某个博客时。我需要填充类别数组来获取它的标题:

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] } ],
}

是的,我得到了类别标题,但我也在博客中得到了一些对象——它们也被填充了。但是博客对象可能包含很多子对象(帖子)我们记得category 字段。那么,类别字段中的所有对象都将被递归填充,并且由于我在博客和类别之间有交叉链接,它将循环填充?

如何限制人口水平?我不希望Blog/category[n]/blogs: []被填充,只直接category字段,例如title。谢谢。

【问题讨论】:

    标签: node.js mongodb mongoose populate


    【解决方案1】:

    来自mongoose docs

    我们是否真的想要两组指针是有争议的 不同步。相反,我们可以跳过填充并直接 find() 我们感兴趣的故事。

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 2012-07-06
      • 2018-09-10
      • 1970-01-01
      相关资源
      最近更新 更多