我有一个像这样的猫鼬模式:
Schema: Item
Schema: SubItem
Schema: SubItemTwo
//Item Schema looks like this:
Item: {
SubItem: [SubItemSchema]
}
SubItemSchema looks like this:
{
field1: String,
field2: String,
OtherItems: [SubItemTwoSchema]
}
SubItemTwoSchema是一些字符串字段的平面模式。
基本上我发现使用query,$ set,$ inc和$ addToSet运算符等使用SubItemSchema.OtherItems几乎是不可能的。 我不相信mongoose方法是有效的,因为我必须在将子数组标记为已修改后基本保存整个“Items”实例 即Mongoose push()和save(),即Item.SubItem [0] .OtherItems.push(thing)
Mongoose只支持嵌入文档数组和数组中的数组 - 使用二级数组不可能做得太多。
所以我的问题是人们使用什么方法来处理这种类型的数据模型,即具有子阵列的数组的对象。我注意到http://docs.mongodb.org/manual/tutorial/model-tree-structures/关于树结构的文档,但是我还没有看到如何在不使用mongoose的push方法的情况下对2级嵌套数组进行建模的任何实现。关于建模树结构的MongoDb文档需要添加字段来引用父项和祖先,但这似乎有点过分,因为我的树只有3层深。
我应该这样: 1.使用文档数组 2.废除mongoose并使用不在数组中的嵌入式文档 3.重新建模我的数据,以便在数组中没有数组?
如果选项3是答案,您如何建议重新设计模式,以便SubItemTwo文档可以是SubItem文档的子项,SubItem文档可以是父项的子项。
由于
答案 0 :(得分:2)
我通过实现包含在子项中的父项数组的模式来解决它。这份工作对我而言。以下是作为模块的实现:https://github.com/mariuskubilius/lbg-mongoose-utils/blob/master/lib/ancestorTree.js
使用这种方式实现:http://docs.mongodb.org/manual/tutorial/model-tree-structures-with-ancestors-array/
如果您需要一些说明,请不要犹豫。