使用mongoose和NodeJS,假设我有一个“汽车”和一个“车轮”模式。这辆车存放了一系列的轮子。
var Wheel = new Schema({
color : { type: String },
timestamp : { type: Date }
});
var Car = new Schema({
wheels : [Wheel],
timestamp : { type: Date }
});汽车文档将包含这些车轮的静态副本,还是将车轮存储为链接(这将在查找时反映车轮的最新状态,即使车轮在创建汽车后发生了更改)。
发布于 2012-07-18 11:10:50
这里模式设计的广泛选择是embedding versus linking。这两种方法都是通过使用约定实现的,并不是服务器实现意义上的真正的“特性”(即MongoDB 2.0服务器不实现任何引用或关系查找特性)。
要弄清楚这些术语:
如果您像在原始示例中那样嵌入,那么您已经创建了一个子文档(或者如您所描述的“静态副本”)。这与存储在其他地方的信息没有关系。
如果链接,则添加的是引用,该引用是另一个集合中文档的主键。如果要将此引用合并到文档中,则需要额外的数据库查询。根据您使用的客户端驱动程序,可能会有一个帮助器自动执行此操作;您也可以手动执行相同的查找。
发布于 2012-07-17 20:43:08
我用另一种方式来做:
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-17 21:54:50
我猜在你的情况下,它是汽车的静态轮子..要使用reference,请使用dbref作为:
var Car = new Schema({
wheels : [ { type : Schema.ObjectId, ref : 'Wheel' } ],
timestamp : { type: Date } });
https://stackoverflow.com/questions/11522210
复制相似问题