首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB是否存储相关文档的链接或副本

MongoDB是否存储相关文档的链接或副本
EN

Stack Overflow用户
提问于 2012-07-17 20:14:34
回答 3查看 354关注 0票数 0

使用mongoose和NodeJS,假设我有一个“汽车”和一个“车轮”模式。这辆车存放了一系列的轮子。

代码语言:javascript
复制
var Wheel = new Schema({
    color : { type: String },
    timestamp : { type: Date }
});

var Car = new Schema({
    wheels : [Wheel],
    timestamp : { type: Date }
});

汽车文档将包含这些车轮的静态副本,还是将车轮存储为链接(这将在查找时反映车轮的最新状态,即使车轮在创建汽车后发生了更改)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-18 11:10:50

这里模式设计的广泛选择是embedding versus linking。这两种方法都是通过使用约定实现的,并不是服务器实现意义上的真正的“特性”(即MongoDB 2.0服务器不实现任何引用或关系查找特性)。

要弄清楚这些术语:

  • Embedding是BSON document.
  • Links (也称为或DBRefs)中对象和数组的嵌套,是文档之间的引用。

如果您像在原始示例中那样嵌入,那么您已经创建了一个子文档(或者如您所描述的“静态副本”)。这与存储在其他地方的信息没有关系。

如果链接,则添加的是引用,该引用是另一个集合中文档的主键。如果要将此引用合并到文档中,则需要额外的数据库查询。根据您使用的客户端驱动程序,可能会有一个帮助器自动执行此操作;您也可以手动执行相同的查找。

票数 1
EN

Stack Overflow用户

发布于 2012-07-17 20:43:08

我用另一种方式来做:

代码语言:javascript
复制
var Car = new Schema({
    wheels : [Schema.ObjectId],
    timestamp : { type: Date }
});

然后假设我有4个轮子和一辆车,我这样做:

代码语言:javascript
复制
car.wheels.push(wheel1._id);
car.wheels.push(wheel2._id);
car.wheels.push(wheel3._id);
car.wheels.push(wheel4._id);

我认为需要先保存Wheels,才能拥有_id属性。

然后在MongoDB中,属性Car.wheels是一个ObjectID数组(因此是对轮子的引用),我可以在Javascript中做到这一点。

代码语言:javascript
复制
car.wheels[0].color

我认为它将以与您的模式相同的方式工作。

票数 0
EN

Stack Overflow用户

发布于 2012-07-17 21:54:50

我猜在你的情况下,它是汽车的静态轮子..要使用reference,请使用dbref作为:

var Car = new Schema({

wheels : [ { type : Schema.ObjectId, ref : 'Wheel' } ],

timestamp : { type: Date } });

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11522210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档