使用mongoose和NodeJS,假设我有一个“Car”和一个“Wheel”架构。这辆车存放了一系列车轮。
var Wheel = new Schema({
color : { type: String },
timestamp : { type: Date }
});
var Car = new Schema({
wheels : [Wheel],
timestamp : { type: Date }
});
汽车文档是否包含这些车轮的静态副本,或者车轮是否存储为链接(即使车辆自创建以来车轮已经更改,也会反映查找车轮的最新状态)。
答案 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 } });