如何在mongoDB中找到第n个嵌套级别的对象? (单个收藏,单个文件)

时间:2015-05-26 12:41:41

标签: node.js mongodb mongoose

我正在尝试使用' _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": []
            }]
        }]
    }]
}

口袋应有更多口袋,并且是动态的。

在这里,我想搜索" pocket"使用" _id" ,说" xxx123456",但不使用静态参考。

再次感谢。

1 个答案:

答案 0 :(得分:0)

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

为什么不使用多个集合,如this answer中所述?

这是一个简单的方法来考虑你的情况,我希望你更容易理解而不是删除一些模式代码......

  1. 将您作为孩子的所有内容存储在同一文档中。给他们独特的_id s。
  2. pocket的所有内容存储为集合。这些收藏品只包含通常放在口袋里的所有id(而不是自己引用口袋)。
  3. 这样,你的很多工作都可以在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,如果您找到,请返回正确的对象!祝你好运!