【问题标题】:Retrieve the second element of array for each document - MongoDB检索每个文档的数组的第二个元素 - MongoDB
【发布时间】: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


【解决方案1】:

你尝试过 $elementAt 吗?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多