node.js - Mongoose 嵌套数组、树和嵌入式文档

标签 node.js mongodb nested mongoose

我有一个像这样的 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 是一些字符串字段的平面架构。

基本上,我发现使用查询、$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 的推送方法的情况下对 2 级嵌套数组进行建模的任何实现。关于建模树结构的 MongoDb 文档需要添加字段来引用父级和祖先,但这似乎有点矫枉过正,因为我的树只有 3 层深。

所以我应该: 1. 使用文档数组 2. 废除 Mongoose 并使用不在数组中的嵌入文档 3. 重新建模我的数据,使数组中不再有数组?

如果选项 3 是答案,您建议如何重新构建架构,以便 SubItemTwo 文档可以是 SubItem 文档的子项,并且 SubItem 文档可以是父项的子项。

谢谢

最佳答案

我通过实现包含子项中包含的父项数组的模式来解决这个问题。为我做这份工作。这是作为模块的实现:https://github.com/mariuskubilius/lbg-mongoose-utils/blob/master/lib/ancestorTree.js

它是使用这种方式实现的:http://docs.mongodb.org/manual/tutorial/model-tree-structures-with-ancestors-array/

如果您需要一些说明,请随时询问。

关于node.js - Mongoose 嵌套数组、树和嵌入式文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21046135/

相关文章:

perl - 我应该避免在 Perl 中嵌套 if 语句吗?

node.js - 在 Node.js 脚本中完成 Cassandra 后,我真的需要调用 client.shutdown() 吗?

javascript - 当使用服务器而不是本地计算机时,我应该用什么替换 "http://localhost:3000"?

javascript - 运行应用程序时出现 Sequelize 索引已存在错误

node.js - 从 mongodb/nodejs 查询嵌套对象数组

c# - MongoDb:用ruby插入UUID后,c#无法将其转换为GUID

javascript - 如何在 Node.js 的 Express.js 中获取多个变量?

javascript - 没有 MongoJS 的 Node.js + MongoDB

python - 带条件的嵌套循环中的 lambda

sql - 在 SQL Server 2008 中使用嵌套 CASE 语句