2017-04-21 130 views
0

我有这个文件n级:查找嵌套子文档的MongoDB

{ 
    "$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如何查询该子文档,例如

"Id": "60228c56-dff2-46d2-a324-b04e3c69e15b" 

我知道,如果我知道现在很多层次它是嵌套的,我可以写一个查询寻找类似的东西

Unidade.Setor.Id=="8457e1b7-39dc-462c-8f46-871882faea2c" 

但是我怎样才能找到一个联合国已知数量的嵌套级别,例如1个,2个,3个n级别?

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

关于如何解决这个问题的评论也将不胜感激。

回答

1

,你唯一能做的事情就是有嵌套查询即

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/

+0

好的答案,你可以添加一些使用C#LINQ sintax为MongoDB C#驱动程序查找的例子吗? – Tony

+1

对不起,我是节点开发人员。我只能回答mongo的一部分。 –

2

在C#中,我们可以创建一个递归的方法来实现此方案。

这里是一个BsonDocument我创建:

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# Query method从MongoDB中得到这个BsonDocument。

这里是我以前通过“ID”查询文件递归方法: BsonDocument result = GetID(doc, "90228c56-eff2-46d2-a324-b04e3c69e15c");

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; 
    } 

我希望这可以给你一些提示。