【问题标题】:How to do query on multiple nested data fields in MongoDB如何查询 MongoDB 中的多个嵌套数据字段
【发布时间】:2013-05-21 12:55:42
【问题描述】:

所以,我要做的是查询所有具有“巴黎”城市“法国”状态的文档。我需要进行某种连接,但我无法弄清楚如何构建它。

我正在使用 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",
    }
    }]
}

【问题讨论】:

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


    【解决方案1】:

    $elemMatch operator 用于表示其中的所有条件必须由同一个数组元素匹配。所以(切换到 shell 语法)匹配所有具有元城市 Paris 的文档,你会这样做

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

    这确保您不会将其数组中某处具有名称:“somethingelse”、值:“巴黎”的东西与匹配名称:“城市”的不同数组元素相匹配。

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

    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"}}
          }
      } 
    )
    

    【讨论】:

      【解决方案2】:

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

      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")))
         );
      

      这会导致跟进 - 我如何获取所有“城市”为“巴黎”且“州”为“法国”但其“区”为“卢浮宫”的文件'?

      【讨论】:

      • 这不太正确 - 您希望 $elemMatch 包含多个条件以指示它们都必须为真才能将数组元素视为匹配。
      猜你喜欢
      • 1970-01-01
      • 2020-03-09
      • 2019-05-17
      • 2019-08-12
      • 2012-05-04
      • 2017-01-27
      • 2019-09-25
      • 2019-09-29
      • 2021-01-23
      相关资源
      最近更新 更多