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

Ale*_*est 9 mongoose mongodb node.js

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

我可以想象的方法之一是存储在与其相关的所有类别的"Post"-object obj_id中.像这样的Smth:

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

并在以后添加类别...

post.category.push(obj_id);
Run Code Online (Sandbox Code Playgroud)

但它真的是一种猫鼬的方式吗?哪种方式是正确的?谢谢.

PS我也读过mongoose docs中的人口方法,在我的案例中它可能有用吗?对我来说还不完全清楚这是什么.

mr.*_*eze 21

Populate是一个更好的工具,因为您在帖子和类别之间创建了多对多的关系.当子文档专属于父对象时,它们是合适的.您需要更改postSchema以使用引用:

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

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

post.category.push(category1);
post.save(callback);
Run Code Online (Sandbox Code Playgroud)

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

Post.findOne({ title: 'Test' })
.populate('category') 
.exec(function (err, post) {
   if (err) return handleError(err);
   console.log(post.category); 
});
Run Code Online (Sandbox Code Playgroud)