MongoDB的聚合框架:仅匹配数组的匹配元素

Dek*_*eka 6 mongodb aggregation-framework

我有一个"类"文件:

{
className: "AAA",
students: [
   {name:"An", age:"13"},
   {name:"Hao", age:"13"},
   {name:"John", age:"14"},
   {name:"Hung", age:"12"}
   ]
}
Run Code Online (Sandbox Code Playgroud)

我希望得到名字为"An"的学生,只获得数组"学生"中的匹配元素.我可以用函数find()做到这一点:

>db.class.find({"students.name":"An"}, {"students.$":true})
{
"_id" : ObjectId("548b01815a06570735b946c1"),
"students" : [ 
    {
        "name" : "An",
        "age" : "13"
    }
]}
Run Code Online (Sandbox Code Playgroud)

这很好,但是当我使用Aggregation执行相同操作时,会出现错误:

db.class.aggregate([
   {$match:{"students.name":'An'}},
   {$project:{"students.$":true}}
])
Run Code Online (Sandbox Code Playgroud)

错误是:

uncaught exception: aggregate failed: {
    "errmsg" : "exception: FieldPath field names may not start with '$'.",
    "code" : 16410,
    "ok" : 0
}
Run Code Online (Sandbox Code Playgroud)

为什么?我不能在aggregate()的$ project运算符中使用"$"作为数组,而在find()的项目运算符中可以使用这个.

小智 1

尝试在管道中使用展开运算符:http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/#pipe._S_unwind

你的聚合看起来像

db.class.aggregate([
     { $match: { "students.name": "An" },
     { $unwind: "$students" },
     { $project: { "students": 1 } }
])
Run Code Online (Sandbox Code Playgroud)