MongoDB:如何通过嵌套文档中的id查找文档

j3d*_*j3d 8 mongodb mongodb-query embedded-documents

鉴于这样的集合:..

[
  {
    "_id" : ObjectId("5546329a470000850084a621"),
    "name": "Joe",
    "surname": "Smith",
    "accounts": [
      {
        "_id" : ObjectId("5546329a470000850084a655"),
        "default": true,
        "status" : "approved",
        "activationTime" : ISODate("2013-05-03T14:37:15.025Z")
      },
      {
        "_id" : ObjectId("5546329a470000850084a688"),
        "default": true,
        "status" : "approved",
        "activationTime" : ISODate("2014-06-03T14:37:15.025Z")
      }
    ]
  },
  {
    "_id" : ObjectId("9546329a470079850084a622"),
    "name": "Jimmy",
    "surname": "Brown",
    "accounts": [
      {
        "_id" : ObjectId("5546329a470790850084a651"),
        "default": true,
        "status" : "suspended",
        "activationTime" : ISODate("2015-02-03T14:37:15.025Z")
      },
      {
        "_id" : ObjectId("5546329a470019850084a611"),
        "default": true,
        "status" : "approved",
        "activationTime" : ISODate("2015-04-03T14:37:15.025Z")
      }
    ]
  },
]
Run Code Online (Sandbox Code Playgroud)

...我怎么找到一份文件accounts.N._id?我试过这个......

db.users.find(
  {},
  {
    "accounts": 0, "accounts": {
      "$elemMatch": { "_id" : ObjectId("5546329a470019850084a611"), "default": true }
    }
  }
)
Run Code Online (Sandbox Code Playgroud)

...但是由于我只得到_id了所有文件,所以它不起作用:

{ "_id" : ObjectId("5546329a470000850084a621") }
{ "_id" : ObjectId("9546329a470079850084a622") }
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

编辑

我实际需要的结果是这样的:

{
  "_id" : ObjectId("9546329a470079850084a622"),
  "name": "Jimmy",
  "surname": "Brown"
}
Run Code Online (Sandbox Code Playgroud)

例如,我需要找到accounts.N._id但不显示嵌套文档本身.

Sal*_*ali 21

使用点符号:

当字段包含嵌入文档时,查询可以指定嵌入文档的完全匹配,也可以使用点表示法指定嵌入文档中各个字段的匹配.

db.coll.find({
   "accounts._id" :ObjectId("5546329a470019850084a611")
})
Run Code Online (Sandbox Code Playgroud)

如果您只需要输出您拥有_id的数组部分,则需要在投影中使用美元

位置$运算符将查询结果的内容限制为仅包含与查询文档匹配的第一个元素.

并且您的查询将如下所示:

db.coll.find({
   "accounts._id" :ObjectId("5546329a470019850084a611")
}, {
   "accounts.$.": 1
})
Run Code Online (Sandbox Code Playgroud)

PS如果你需要一个像你的修改问题的输出,使用:

db.coll.find({
   "accounts._id" :ObjectId("5546329a470019850084a611")
 }, {
   accounts : 0
 })
Run Code Online (Sandbox Code Playgroud)


Gau*_*ave 5

$ elemMatch运算符将查询结果中字段的内容限制为仅包含与$ elemMatch条件匹配的第一个元素.

在你的情况下:

db.users.find({'_id': ObjectId('5546329a470000850084a621')}, {accounts: {$elemMatch: {_id: ObjectId('5546329a470000850084a655')}}})
Run Code Online (Sandbox Code Playgroud)

参考:Mongo Docs