2016-06-17 24 views
1

我有收集:获取阵列或全无的第一个元素,如果数组为空

[ 
    {"_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”。

回答

2

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

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银行足球比赛处理和$literal operator.The条件是$eq如果阵列的$size是0,返回true。

管道运算符$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" } 

请注意,这是不可能排除在文档中的“情节”字段。

2

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

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

,因为如果指数超过数组边界,$arrayElemAt不返回任何结果,表明C不会有任何firstEpisode

相关问题