如何使用mongodb获取基于键值的嵌套对象?

如何使用mongodb获取基于键值的嵌套对象?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有以下格式的记录 { "_id" : ObjectId("609cd99d1af4ac1036d78f7d"), "userrole" : "admins", "locks" : [ { "userid" : "2932fb99-4c41-4342-99e0-af15f8146da0", "useremail" : "fsas

我有以下格式的记录

{
"_id" : ObjectId("609cd99d1af4ac1036d78f7d"),
"userrole" : "admins",
"locks" : [
{
"userid" : "2932fb99-4c41-4342-99e0-af15f8146da0",
"useremail" : "fsasdev@gmail.com",
"filepath" : "output/notes.txt",
.
.
}
]
}
如何获取文件路径与“output/notes.txt”匹配的userid、useremail?

演示-

使用

positional$操作符限制数组的内容,以返回与数组上的查询条件匹配的第一个元素


演示-


我只想获取该特定对象的详细信息,我如何才能做到这一点?@sd更新回答这非常有效,非常感谢您的快速回答。你能告诉我你为什么用$match两次吗?如果我只使用一次就可以了,因为庞大的数据集unwind将运行所有文档,我们希望减少这一数量以加快查询速度,所以我们首先筛选记录,以确保我们得到的用于unwind的记录更少。
db.collection.find({
  "locks.filepath": "output/notes.txt" // query 
},
{
  "locks.$": 1 // projection
})
db.collection.aggregate([
  {
    $match: { "locks.filepath": "output/notes.txt" } // filter to reduce load in unwind
  },
  { $unwind: "$locks" }, //  break into individual documents
  {
    $match: { "locks.filepath": "output/notes.txt" } // filter
  },
  {
    $replaceRoot: { "newRoot": "$locks" } // set root as $locks
  }
])