0

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

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

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

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

4

3 回答 3

1

这里模式设计的广泛选择是嵌入与链接。这两者都是通过使用约定实现的,在服务器实现意义上并不是真正的“功能”(即 MongoDB 2.0 服务器没有实现任何引用或关系查找功能)。

要明确条款:

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

  • 链接(又名数据库引用DBRefs)是文档之间的引用。

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

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

于 2012-07-18T03:10:49.970 回答
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);

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

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

car.wheels[0].color

我想它会以与您的模式相同的方式工作。

于 2012-07-17T12:43:07.813 回答
0

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

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

于 2012-07-17T13:54:50.320 回答