MongoDB查找:查询具有嵌套字典结构的字段

jxct1oxe  于 2023-03-29  发布在  Go
关注(0)|答案(2)|浏览(203)

我有一个集合,其中有一个字段作为嵌套字典。
样品:

{
"_id": ObjectId(""),
"family_member": {
     "mother":{
        "name": "Mary",
        "age": 40,
        "address": {
            "city": "Dover",
            "state": "Delaware",
            "zip_code": "19901"
        }
     },
     "father":{
        "name": "John",
        "age": 43,
        "address": {
            "city": "Dover",
            "state": "Delaware",
            "zip_code": "19901"
        }
     },
     "brother":{
        "name": "Jordan",
        "age": 13,
        "address": {
            "city": "Honolulu",
            "state": "Hawaii",
            "zip_code": "96813"
        }
     }
}
}

我想得到一份文件的清单,其中任何家庭成员居住在夏威夷。基本上是这样的:db.users.find({'family_member.*.address.state': "Hawaii"})
这样的事情是可能的吗?或者我必须写多个匹配条件吗?

q9rjltbz

q9rjltbz1#

您可以使用带通配符的点表示法来匹配任何家族成员:

db.collection.find({"family_member.$*.address.state": "Hawaii"})

这将返回所有家庭成员的地址状态为“夏威夷”的文档。但是,请注意,此语法仅在MongoDB 4.4及更高版本中支持。
希望这能有所帮助!

yruzcnhs

yruzcnhs2#

您将需要使用聚合框架来匹配不同字段的子文档。
在您的情况下,您可以将对象转换为数组,过滤条件并转换回对象。

db.collection.aggregate([
  {
    "$project": {
      "family_member": {
        "$arrayToObject": [
          {
            "$filter": {
              "input": {
                "$objectToArray": "$family_member"
              },
              "as": "member",
              "cond": {
                $eq: [
                  "$$member.v.address.state",
                  "Hawaii"
                ]
              }
            }
          }
        ]
      }
    }
  }
])

相关问题