Mongoose 猫鼬模式&x2013;对子文档使用对象而不是数组

Mongoose 猫鼬模式&x2013;对子文档使用对象而不是数组,mongoose,schema,subdocument,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: 12

我正在使用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
对象不是数组,例如
buildings:[BuildingSchema]
,因为我听说Mongo在使用大型数组时表现不佳(而且建筑物的顺序并不重要)。

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

buildings: [BuildingSchema]
对象和数组的符号。例如,如果添加新建筑

GameStateSchema.update({$set: {"buildings.1": {name: "cabin", x:128, y: 0}   }})
Mongoose将使用
BuildingSchema
添加新建筑,进行非常基本(但至关重要)的验证,例如,建筑只能有
名称
x
y

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


EDIT–我说得太快了,结果表明,通过Mongoose模型实例访问
建筑物
只在它是数组时有效。问题仍然存在。

你所说的验证一切是什么意思?此外,您不能在GameStateSchema中定义值,该模式包含类型等,而不是数据。“验证”是指检查强制转换和“模式严格模式”写入数据库。不是更复杂的猫鼬验证方法。天啊,是的,对不起,我忘了给数据行加注释了!正在编辑。尽管您反对,但您应该在此处为
建筑使用数组。毫无疑问。是的,我想你是对的,约翰尼。我忽略了一个事实,Mongo没有通配符字段名,因此只能通过id找到一座建筑,例如,找到所有的灯塔将是一件痛苦的事情。对于大型阵列,似乎最好的解决方案是将其拆分为较小的阵列(如果对您的数据有意义的话)。另外,Mongo2.6有$position修饰符,可以加快处理数组的速度。呃,这是真的吗:搜索一个数组只能返回一个、一个或所有数组元素(也就是说,不可能找到所有的灯塔)?!如果是这样的话,那么阵列肯定不是解决问题的办法。下一次尝试:一个巨大的碎片建筑收藏。