【问题标题】:How to find an object which is at nth nested level in mongoDB? (single collection, single document)如何在mongoDB中找到第n个嵌套级别的对象? (单个集合,单个文档)
【发布时间】:2015-05-26 12:41:40
【问题描述】:

我正在尝试使用同一文档中的“_id”查找第 n 个对象。

任何建议或参考或代码示例将不胜感激。

(例如)

文档将如下所示:

{
    "_id": "xxxxx",
    "name": "One",
    "pocket": [{
        "_id": "xxx123",
        "name": "NestedOne",
        "pocket": []
    }, {
        "_id": "xxx1234",
        "name": "NestedTwo",
        "pocket": [{
            "_id": "xxx123456",
            "name": "NestedTwoNested",
            "pocket": [{"_id": "xxx123666",
                "name": "NestedNestedOne",
                "pocket": []
            }]
        }]
    }]
}

口袋应该能容纳更多的口袋,而且是动态的。

在这里,我想使用“_id”搜索“口袋”,比如“xxx123456”,但不使用静态引用。

再次感谢。

【问题讨论】:

  • 很难更新嵌套的动态键,并且将数据保持在过于嵌套的位置并不是一个好习惯。查看您的文档后,我不明白为什么您将pocket inside pocket inside pocket... 放在更改文档结构然后使用更新的更好方法

标签: node.js mongodb mongoose


【解决方案1】:

我强烈建议您将文档结构更改为更易于管理/搜索的结构,因为这样做只会变得更加痛苦。

为什么不使用多个集合,就像this answer 中解释的那样?

所以一个简单的方法来考虑你的情况,我希望你比删除一些架构代码更容易推理......

  1. 将您所有的东西作为孩子存储在同一个文档中。给他们独特的_ids。
  2. 将其pockets 的所有内容存储为集合。集合只是包含通常位于口袋内的所有ids(而不是引用口袋本身)。

这样,您的很多工作都可以在 DB 调用之外进行。您只需在需要时批量提取所需的项目,而不是搜索嵌套文档!

但是,如果您可以处理整个文档:
看起来您想进行一定数量的深度递归搜索。我会用一些伪代码给你一个大致的想法,希望你能弄清楚其余的。

假设你的功能是:

function SearchNDeep(obj, n, id){
  /**
  You want to go down 1 level, to pocket
  see if pocket has any things in it. If so:
  Check all of the things...for further pockets...

  Once you've checked one level of things, increment the counter.
  When the counter reaches the right level, you'd want to then see if the object you're checking has a `'_id'` of `id`.
**/
}

这是一般的想法。有一种更简洁、递归的方法可以做到这一点,您可以在调用 SearchNDeep 的同时传递一个数字来表示您的深度、基本情况不再需要关卡或找到对象。

如果找不到,请记得返回falseundefined,如果找到,请记得返回正确的对象!祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2015-08-19
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多