1

我正在使用 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 在大型数组中表现不佳(并且建筑物的顺序并不重要)。

4

1 回答 1

0

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

buildings: [BuildingSchema]

对象和数组的符号。例如,如果您添加一个新建筑物...

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

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

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

编辑——我说得太早了,结果证明buildings通过 Mongoose 模型实例访问只有在它是一个数组时才有效。问题仍然存在。

于 2014-09-01T13:02:57.040 回答