首页 > 解决方案 > 查询名称中带点的嵌套文档字段

问题描述

考虑这样一个集合:

> db.test.find({})
{ "_id" : ObjectId("5f969419d40c1580f2d4aa31"), "users" : { "foo@bar.com" : "baz" } }
{ "_id" : ObjectId("5f9694d4d40c1580f2d4aa33"), "users" : { "baz@test.com" : "foo" } }

我想查找users包含 field的文档foo@bar.com。首先我试过

> db.test.find({"users.foo@bar.com": { $exists: true } })

但它什么也没返回。由于字段名称中的点 (.),它正在寻找这样一个字段:users > foo@bar > com它不存在。我了解到键名中的点可以转义,\u002e所以我尝试了

> db.test.find({"users.foo@bar\u002ecom": { $exists: true } })

但它也没有返回任何内容。我想我没有正确逃脱。我该怎么做?

标签: mongodbmongodb-querymongo-shell

解决方案


您可以使用聚合来做到这一点。试试这个查询。

db.test.aggregate([
  {
    "$project": {
      "users": {
        "$objectToArray": "$users"
      }
    }
  },
  {
    "$match": {
      "users.k": "foo@bar.com"
    }
  },
  {
    "$project": {
      "users": {
        "$arrayToObject": "$users"
      }
    }
  }
])

这里是Mongo游乐场


推荐阅读