Mongoose模式 - 使用Object而不是Array来存储子文档

时间:2014-08-30 13:04:01

标签: mongoose schema subdocument

我使用Node(0.10.5)/ Mongo(2.4)/ Mongoose(3.6)构建游戏,我有一个像这样的Mongoose架构......

var GameStateSchema = new Schema(
    {
        buildings: {
            // This object will contain buildings of the same structure, e.g.
            // "1": {name: "cabin", x: 128, y: 0},
            // "2": {name: "lighthouse", x: 192, y: 64}
            // It'll grow to several hundred buildings.
        },
        nextId: 3
    }
);

var BuildingSchema = new Schema(
    {
        name: String, x: Number, y: Number
    }
);

buildings个对象中的每个建筑物都使用BuildingSchema的最佳方法是什么?我真的不想下去手动验证一切的途径!

注意:buildings对象不是数组,例如buildings: [BuildingSchema],因为我听说Mongo对大型阵列表现不佳(而且建筑物的顺序并不重要)。

1 个答案:

答案 0 :(得分:0)

啊,答案很简单。你可以使用相同的......

buildings: [BuildingSchema]

对象和数组的表示法。例如,如果您添加新建筑......

GameStateSchema.update({$set: {"buildings.1": {name: "cabin", x:128, y: 0}   }})

Mongoose将使用BuildingSchema添加新建筑,进行非常基本(但至关重要)的验证,例如建筑物只能有namexy

如果在$ set items之前没有显式创建buildings数组,则默认为对象。比特反直觉但非常方便:)

编辑 - 我说得太早了,通过Mongoose模型实例访问buildings只有当它是一个数组时才能工作。问题仍然存在。