如果数组为空,则获取数组的第一个元素或什么都不是

时间:2016-06-17 16:05:43

标签: mongodb aggregation-framework

我有收藏:

as.numeric(gsub("^.*- ([0-9]+).*$", "\\1", cpu))

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

[
    {"_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将“显示C”丢弃。

2 个答案:

答案 0 :(得分:2)

使用$arrayElemAt Array运算符返回指定数组索引处的元素:

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

由于索引超出数组范围,$arrayElemAt不会返回任何结果,因此显示C不会有firstEpisode

答案 1 :(得分:2)

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

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 ition处理和$literal运算符为“episodes”分配默认值。条件为{ {3}}如果数组的$eq为0,则返回true。

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

管道中的最后一个阶段是$unwind阶段,您的文档按_id分组,并使用$group累加器运算符返回数组中的“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" }

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