node.js - Mongoose – 将对象相互链接而不重复

标签 node.js mongodb mongoose

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

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

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

稍后添加类别...

post.category.push(obj_id);

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

附注我还阅读了 Mongoose 文档中的人口方法,它对我的​​情况有用吗?我仍然不完全清楚这是什么。

最佳答案

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);

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

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

关于node.js - Mongoose – 将对象相互链接而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17244825/

相关文章:

javascript - 在 NodeJs 中为 Ajax 调用创建路由

java - 如何在没有时区的mongo DB中插入日期

json - 无法通过声明的 mongoosejs 模式保存 JSON

javascript - Vue Element.ui 树,发出重新加载事件

node.js - 如何升级 NodeJS Docker 容器?

node.js - 在nodejs上的post请求中设置字符集

mongodb - 如何监听 MongoDB 集合的变化?

MongoDB AggregationOutput 响应时间更长

angular - 如何在 angular2/浏览器上使用 mongoose

node.js - 在Google Assistant上播放特定时间的媒体对象