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

时间:2012-07-17 12:14:34

标签: node.js mongodb mongoose

使用mongoose和NodeJS,假设我有一个“Car”和一个“Wheel”架构。这辆车存放了一系列车轮。

var Wheel = new Schema({
    color : { type: String },
    timestamp : { type: Date }
});

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

汽车文档是否包含这些车轮的静态副本,或者车轮是否存储为链接(即使车辆自创建以来车轮已经更改,也会反映查找车轮的最新状态)。

3 个答案:

答案 0 :(得分:1)

这里的架构设计的广泛选择是embedding versus linking。这两者都是按使用惯例实现的,并不是服务器实现意义上的“功能”(即MongoDB 2.0服务器没有实现任何引用或关系查找功能)。

明确条款:

  • 嵌入是BSON文档中对象和数组的嵌套。

  • 链接(又名 Database References DBRefs )是文档之间的引用。

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

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

答案 1 :(得分:0)

我是用另一种方式做的:

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

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

car.wheels.push(wheel1._id);
car.wheels.push(wheel2._id);
car.wheels.push(wheel3._id);
car.wheels.push(wheel4._id);

我认为之前需要保存车轮才能拥有_id属性。

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

car.wheels[0].color

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

答案 2 :(得分:0)

我想在你的情况下,它是汽车中的静态车轮。要使用参考,请使用dbref作为:

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