Mongoose嵌套数组,树和嵌入式文档

时间:2014-01-10 13:55:06

标签: node.js mongodb nested mongoose

我有一个像这样的猫鼬模式:

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文档可以是父项的子项。

由于

1 个答案:

答案 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/

如果您需要一些说明,请不要犹豫。