10

我有一个模型“类别”。集合categories包含多个对象。我还有一个模型“Post”。集合posts可能包含很多带有用户帖子的对象。“帖子”对象可能与 1+ 个类别有关。如何将“发布”对象链接到 1+“类别”对象而不将“发布”对象作为子文档放置在“类别”对象中?当然,我需要有一个选项来查找与某个类别相关的所有帖子。

我能想象的一种方法是将与其相关的所有类别的“Post”对象 obj_id 存储在其中。像这样:

var postSchema = mongoose.Schema({
  title: String,
  description: String,
  category: [ObjectId],
  created_time: Number,
})

稍后添加类别...

post.category.push(obj_id);

但这真的是猫鼬方式吗?哪种方式是正确的?谢谢。

PS我也读过猫鼬文档中的人口方法,对我来说可能有用吗?我仍然不完全清楚这是什么。

4

1 回答 1

26

填充是一个更好的工具,因为您正在创建帖子和类别之间的多对多关系。当子文档完全属于父对象时,它们是合适的。您将需要更改您的 postSchema 以使用参考:

var postSchema = mongoose.Schema({
  title: String,
  description: String,
  category: [{ type: Schema.Types.ObjectId, ref: 'Category' }],
  created_time: Number,
});

您可以通过将文档推送到数组来添加类别:

post.category.push(category1);
post.save(callback);

然后在查询期间使用填充重新水化它们:

Post.findOne({ title: 'Test' })
.populate('category') 
.exec(function (err, post) {
   if (err) return handleError(err);
   console.log(post.category); 
});
于 2013-06-22T01:34:54.000 回答