【发布时间】:2016-06-28 02:22:33
【问题描述】:
我有一个名为 bios 的 MongoDB 集合,其中包含与以下类似的文档:
{
"_id" : ObjectId("51df07b094c6acd67e492f41"),
"name" : {
"first" : "John",
"last" : "McCarthy"
},
"birth" : ISODate("1927-09-04T04:00:00Z"),
"death" : ISODate("2011-12-24T05:00:00Z"),
"contribs" : [
"Lisp",
"Artificial Intelligence",
"ALGOL"
]
},
{
"_id" : 3,
"name" : {
"first" : "Grace",
"last" : "Hopper"
},
"title" : "Rear Admiral",
"birth" : ISODate("1906-12-09T05:00:00Z"),
"death" : ISODate("1992-01-01T05:00:00Z"),
"contribs" : [
"UNIVAC",
"compiler",
"FLOW-MATIC",
"COBOL"
]
}
我的目标是为bios 集合中的每个文档检索数组 contribs 的第二个元素。
使用新的聚合管道运算符 $filter 我运行以下查询:
> db.bios.aggregate([
{
$match: {"contribs.2":{"$exists":1}}},
{
$project:{contribs:
{
$filter:{input:"$contribs", as: "contribs", cond:{}}},_id:0}}])
根据我的查询,输出是:
{ "contribs" : [ "Lisp", "Artificial Intelligence", "ALGOL" ] }
{ "contribs" : [ "UNIVAC", "compiler", "FLOW-MATIC", "COBOL" ] }
这不仅仅是数组contribs 的第二个元素,而是contribs 数组的第二个元素存在时的投影。
【问题讨论】:
-
在这里使用
.aggregate()可能是矫枉过正。使用db.bios.find({ "contribs.1": { "$exists": true } },{ "contribs.$": 1 })将返回匹配的元素。返回的"contribs"仍然是一个数组,但它只是一个元素,因此很容易在代码中引用。$arrayElemAt运算符将作为单个值返回,但除非您在该结果之后继续聚合管道,否则它应该没有必要。也不是最高效的方法。
标签: mongodb aggregation-framework