Mongoose 猫鼬模式&x2013;对子文档使用对象而不是数组
我正在使用Node(0.10.5)/Mongo(2.4)/Mongoose(3.6)构建一个游戏,我有一个类似于这样的Mongoose模式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
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修饰符,可以加快处理数组的速度。呃,这是真的吗:搜索一个数组只能返回一个、一个或所有数组元素(也就是说,不可能找到所有的灯塔)?!如果是这样的话,那么阵列肯定不是解决问题的办法。下一次尝试:一个巨大的碎片建筑收藏。