为每个文档检索数组的第二个元素-MongoDB

为每个文档检索数组的第二个元素-MongoDB,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个名为bios的MongoDB集合,其中包含与以下类似的文档: { "_id" : ObjectId("51df07b094c6acd67e492f41"), "name" : { "first" : "John", "last" : "McCarthy" }, "birth" : ISODate("1927-09-04T04:00:00Z"),

我有一个名为
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的第二个元素。 使用新的聚合管道操作符,我运行以下查询:

> 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
数组上的投影

你试过$elementAt吗

db.bios.aggregate([
  { $match: {"contribs.1": { "$exists": 1 } }},
  { $project: { contribs: { $arrayElemAt: [ "$contribs", 1 ] } } }
]);

你试过$elementAt吗

db.bios.aggregate([
  { $match: {"contribs.1": { "$exists": 1 } }},
  { $project: { contribs: { $arrayElemAt: [ "$contribs", 1 ] } } }
]);
在这里使用
.aggregate()
可能有些过分。使用
db.bios.find({“contribs.1”:{“$exists”:true},{“contribs.$”:1})
将返回匹配的元素。返回的
“contribs”
仍然是一个数组,但它将仅是一个元素,因此很容易在代码中引用。运算符将作为单个值返回,但除非在该结果之后继续聚合管道,否则不必返回。也不是最有效的方法。使用
.aggregate()。使用
db.bios.find({“contribs.1”:{“$exists”:true},{“contribs.$”:1})
将返回匹配的元素。返回的
“contribs”
仍然是一个数组,但它将仅是一个元素,因此很容易在代码中引用。运算符将作为单个值返回,但除非在该结果之后继续聚合管道,否则不必返回。也不是最有效的方法。