猫鼬 - 将对象彼此链接而不重复

时间:2013-06-21 21:48:38

标签: node.js mongodb mongoose

我有一个模型“类别”。集合categories包含多个对象。 我也有一个模型“邮政”。集合posts可能包含许多具有用户帖子的对象。 “发布”对象可能涉及1个以上的类别。如何将“发布”对象链接到1+“类别” - 对象而不将“发布” - 对象放在“类别” - 对象作为子文档?当然,我需要有一个选项来查找与某个类别相关的所有帖子。

我可以想象的一种方法是存储与其相关的所有类别的“发布” - 对象obj_id。像这样的Smth:

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

稍后再添加类别......

post.category.push(obj_id);

真的是一种猫鼬的方式吗?哪种方式是正确的?感谢。

P.S。我也读过mongoose docs中的种群方法,在我的情况下它可能有用吗?我还不完全清楚这是什么。

1 个答案:

答案 0 :(得分:20)

Populate是一个更好的工具,因为您在帖子和类别之间创建了多对多的关系。当子文档专属于父对象时,它们是合适的。您需要更改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);

然后在查询期间使用populate:

重新水化它们
Post.findOne({ title: 'Test' })
.populate('category') 
.exec(function (err, post) {
   if (err) return handleError(err);
   console.log(post.category); 
});