首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找n级嵌套SubDocument MongoDB

查找n级嵌套SubDocument MongoDB
EN

Stack Overflow用户
提问于 2017-04-21 18:00:10
回答 2查看 1.1K关注 0票数 1

我有一份文件:

代码语言:javascript
复制
{
  "$id": "1",
  "DocType": "Unidade",
  "Nome": "TONY",
  "RG_InscricaoEstadual": "4347924938742",
  "Setores": [
    {
      "$id": "9",
      "Nome": "Child0",
      "Setores": [
        {
          "$id": "10",
          "Nome": "Child1",
          "Setores": [
                     /* <n depth nested level> */
                     "$id": "11",
                     "Nome": "Child2",
                     "Id": "90228c56-eff2-46d2-a324-b04e3c69e15c",
                     "DocType": "Setor"
          ],
          "Id": "60228c56-dff2-46d2-a324-b04e3c69e15b",
          "DocType": "Setor"
        }
      ],
      "Id": "8457e1b7-39dc-462c-8f46-871882faea2c",
      "DocType": "Setor"
    }
  ]
}

如果我想检索一个Setor,如何查询这个SubDocument,例如

代码语言:javascript
复制
"Id": "60228c56-dff2-46d2-a324-b04e3c69e15b"

我知道,如果我现在知道很多级别都是嵌套的,我可以编写一个查询来查找类似的内容

代码语言:javascript
复制
Unidade.Setor.Id=="8457e1b7-39dc-462c-8f46-871882faea2c"

但是,我如何搜索一个未知数量的嵌套级别,例如1、2、3n个级别?

例如,如何找到带有'90228c56-eff2-46d2-a324-b04e3c69e15c',Id的Setor?

关于如何解决这个问题的意见也将受到欢迎。

EN

回答 2

Stack Overflow用户

发布于 2017-04-24 06:33:43

在c#中,我们可以创建一个递归方法来实现这个场景。

下面是我创建的一个BsonDocument:

代码语言:javascript
复制
 BsonDocument doc = new BsonDocument {
            { "id","1"},
            { "DocType", "Unidade"},
            { "Nome", "TONY"},
            { "RG_InscricaoEstadual", "4347924938742"},
            { "Setores",new BsonArray {
             new BsonDocument {
             { "id","9" },
             { "Nome", "Child0"},
             { "Setores", new BsonArray { new BsonDocument {
                          { "id","10" },
                          { "Nome", "Child1"},
                          { "Setores", new BsonArray { new BsonDocument {
                                       { "id","11" },
                                       { "Nome", "Child2"},
                                       {  "Id","90228c56-eff2-46d2-a324-b04e3c69e15c" },
                                       { "DocType", "Setor"}
                                       }
                                       }
                          },
                          {  "Id","60228c56-dff2-46d2-a324-b04e3c69e15b" },
                          { "DocType", "Setor"}
                 }
                 }
                 },
                 {  "Id","8457e1b7-39dc-462c-8f46-871882faea2c" },
                 { "DocType", "Setor"}
                 }
            }
            }
            };

您可以使用Mongo c#查询方法从MongoDB获取这个BsonDocument。

下面是我用来通过“Id”查询文档的递归方法:BsonDocument result = GetID(doc, "90228c56-eff2-46d2-a324-b04e3c69e15c");

代码语言:javascript
复制
 public static BsonDocument GetID(BsonDocument doc, string queryId)
    {
        BsonDocument result = new BsonDocument();
        if (doc.Elements.Where(c => c.Name == "Setores").Count() != 0)
        {
            foreach (var item in doc.GetElement("Setores").Value.AsBsonArray)
            {
                var id = item.AsBsonDocument.GetElement("Id").Value;
                if (id == queryId)
                {
                    result = item.AsBsonDocument;
                    break;
                }
                result = GetID(item.AsBsonDocument, queryId);
            }
        }
        return result;
    }

我希望这能给你一些提示。

票数 3
EN

Stack Overflow用户

发布于 2017-04-21 21:35:11

您唯一能做的就是进行嵌套查询,即

代码语言:javascript
复制
find({"Unidade.Setor.Id": ObjectId("8457e1b7-39dc-462c-8f46-871882faea2c")
find({"Unidade.Setor.Setor.Id": ObjectId("8457e1b7-39dc-462c-8f46-871882faea2c")
find({"Unidade.Setor.Setor.Setor.Id": ObjectId("8457e1b7-39dc-462c-8f46-871882faea2c")

如果上一次失败,则一个接一个地运行。

但不要!

您应该将这些Setor记录存储为单独的文档。您可以使用相互引用来存储它们,然后使用查找(如SQL中的联接)查询它们。

https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43549233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档