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

Posted

技术标签:

【中文标题】检索每个文档的数组的第二个元素 - MongoDB【英文标题】:Retrieve the second element of array for each document - 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 运算符将作为单个值返回,但除非您在该结果之后继续聚合管道,否则它应该没有必要。也不是最高效的方法。 【参考方案1】:

你尝试过 $elementAt 吗?

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

【讨论】:

以上是关于检索每个文档的数组的第二个元素 - MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB中Array数组的项目元素

访问可变数组列中的第二个元素

applyBindings 的第二个参数是做啥用的?

使用聚合 $lookup 加入 mongodb

基于子数组的第二个元素对多维数组进行排序

在以下数组的第二个元素后插入元素3 var ar = [1,2,4,5,6];