mongodb - 获取数组的第一个元素,如果数组为空,则不获取任何内容

标签 mongodb aggregation-framework

我有收藏:

[
    {"_id": 1, "show": "Show A", "episodes": ["a", "b", "c"]},
    {"_id": 2, "show": "Show B", "episodes": ["first"]},
    {"_id": 3, "show": "Show C", "episodes": []}
]

我需要将它(通过聚合框架)转换为:

[
    {"_id": 1, "show": "Show A", "firstEpisode": "a"},
    {"_id": 2, "show": "Show B", "firstEpisode": "first"},
    {"_id": 3, "show": "Show C"}
]

$slice 返回数组,但我需要值。

$unwind 去掉“show C”。

最佳答案

您只需要 $project您的文件并使用 $arrayElemAt MongoDB 3.2 中的新运算符。

db.coll.aggregate(
    [
        { "$project": { 
            "show": 1, 
            "firstEpisode": { "$arrayElemAt": [ "$episodes", 0 ] } 
        }}
    ]
)

产生:

{ "_id" : 1, "show" : "Show A", "firstEpisode" : "a" }
{ "_id" : 2, "show" : "Show B", "firstEpisode" : "first" }
{ "_id" : 3, "show" : "Show C" }

现在从 MongoDB 3.0 开始,您需要一种不同的方法。

首先,如果数组为空,您需要使用逻辑$cond 为“episodes”分配一个默认值。处理和 $literal运算符。条件为$eq如果 $size 返回真数组的值为 0。

$unwind管道运算符解构“episodes”数组。

管道的最后阶段是 $group阶段,您可以按 _id 对文档进行分组并使用 $first累加器运算符返回数组中的“第一个”元素。

db.coll.aggregate(
    [
        { "$project": { 
            "show": 1, 
            "episodes": { 
                "$cond": [ 
                    { "$eq": [ { "$size": "$episodes" }, 0 ] }, 
                    { "$literal": [ null ] }, 
                    "$episodes" 
                ]
            }
        }}, 
       { "$unwind": "$episodes" }, 
       { "$group": { 
           "_id": "$_id",  
           "show": { "$first": "$show" }, 
           "firstEpisode": { "$first": "$episodes" } 
       }}  
    ]
)

产生:

{ "_id" : 3, "show" : "Show C", "firstEpisode" : null }
{ "_id" : 2, "show" : "Show B", "firstEpisode" : "first" }
{ "_id" : 1, "show" : "Show A", "firstEpisode" : "a" }

请注意,无法排除文档中的“episodes”字段。

关于mongodb - 获取数组的第一个元素,如果数组为空,则不获取任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37885925/

相关文章:

MongoDB 聚合 - 在单个查询中以 2 种方式分组

mongodb - mongodb 聚合框架管道如何工作?

javascript - 属性未添加到 JS 对象

python - 如何调试 scrapy 管道?

Java MongoDb : Dot Notation

node.js - 在 AWS 上运行的 NodeJS 应用程序的 Mongoose CastError

node.js - Mongodb试图让选定的字段从聚合中返回

mongodb - 如何使用 mongodb 聚合和检索整个文档

javascript - 通过key进行区分,然后得到key以外字段的结果

mongodb - mongo恢复期间出现异常