Mongoose – 将对象相互链接而不重复

Posted

技术标签:

【中文标题】Mongoose – 将对象相互链接而不重复【英文标题】:Mongoose – linking objects to each other without duplicating 【发布时间】:2013-06-19 03:36:55 【问题描述】:

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

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

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

稍后添加类别...

post.category.push(obj_id);

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢! post.category.push(category1); 中的 category1 到底应该是什么?它应该是带有 objectID 的字符串还是其他?还有一个问题:什么是“补水”?这个过程有什么作用?为什么我需要它? 它应该是一个实际的类别模型实例。再水化我的意思是用实际文档而不是 ID 填充参考。

以上是关于Mongoose – 将对象相互链接而不重复的主要内容,如果未能解决你的问题,请参考以下文章

如果不存在,Mongoose会将多个对象添加到数组中

Mongoose 从架构 arr 中删除对象 [重复]

执行链接而不刷新页面[重复]

使用 mongoose 在 MongoDB 中批量插入

无法向 Mongoose 查询返回的对象添加新属性 [重复]

无法向 Mongoose 查询返回的对象添加新属性 [重复]