如何查询MongoDB中的多个嵌套数据字段

时间:2013-05-21 12:55:43

标签: mongodb mongodb-.net-driver mongodb-query

所以,我要做的是查询所有拥有'巴黎'城市状态'法国'的文件。我需要做一些联接,但我还没弄清楚如何构建它。

我正在使用c#驱动程序,但我很乐意接受使用任何方法的帮助。

{
    "_id" : ObjectId("519b407f3c22a73a7c29269f"),
    "DocumentID" : "1",
    "Meta" : [{
        "Name" : "City",
        "Value" : "Paris",
    }, {
        "Name" : "State",
        "Value" : "France",
    }
    }]
}

{
    "_id" : ObjectId("519b407f3c22a73a7c29269g"),
    "DocumentID" : "2",
    "Meta" : [{
        "Name" : "City",
        "Value" : "Paris",
    }, {
        "Name" : "State",
        "Value" : "Texas",
    }
    }]
}

2 个答案:

答案 0 :(得分:2)

$elemMatch operator用于表示其中的所有条件必须由相同的数组元素匹配。所以(切换到shell语法)匹配所有具有meta city Paris的文档

db.collection.find( {Meta:{$elemMatch:{Name:"City",Value:"Paris"}}} )

这确保你不会匹配具有名称的东西:“somethingelse”,值:“Paris”在其数组中的某处,其中不同的数组元素与名称匹配:“城市”。

现在,用于组合查询条件的默认组合是“和”,因此您可以继续添加属性:

db.collection.find( {Meta: {
                       $elemMatch:{Name:"City",Value:"Paris"}, 
                       $elemMatch:{Name:"State",Value:"France"} 
      }
  } 
)

现在,如果你想添加另一个条件你继续添加它,但是如果你想要一个NOT那么你就这样做:

db.collection.find( {Meta: {
                       $elemMatch:{Name:"City",Value:"Paris"}, 
                       $elemMatch:{Name:"State",Value:"France"},
                       $not: {$elemMatch:{Name:"Arrondissement",Value:"Louvre"}}
      }
  } 
)

答案 1 :(得分:0)

可能在这里回答我自己的问题,但我是MongoDB的新手,所以虽然这似乎给了我我所追求的结果,但它可能不是最佳方法。< / p>

var result = collection.Find(
   Query.And(
   Query.ElemMatch("Meta", Query.EQ("Name", "City")),
   Query.ElemMatch("Meta", Query.EQ("Value", "Paris")),
   Query.ElemMatch("Meta", Query.EQ("Name", "State")),
   Query.ElemMatch("Meta", Query.EQ("Value", "France")))
   );

这导致了一个跟进 - 我如何获得所有'城市'是'巴黎'和'州'是'法国'但其'Arrondissement'是'卢浮宫的文件“?