2014-09-29 41 views
1

我有一个文档集合看起来是这样的:

{ 
    "campaignType" : 1, 
    "allowAccessControl" : true, 
    "userId" : "108028399" 
} 

我想使用聚合框架来查询此集合,并有一个结果,看起来像这样:

{ 
    "campaignType" : ["APPLICATION"], 
    "allowAccessControl" : "true", 
    "userId" : "108028399", 
} 

你会发现:

  • campaignType场变和阵列
  • 数值被映射为一个字符串

可以在使用聚合框架来完成?

我试着看着$addToSet$push,但没有运气。

请帮忙。

感谢

回答

1

在这两种情况下,这是从聚合框架,是你的朋友日$cond运营商。它是一个“三元”运算符,这意味着它将评估true|false的条件,然后根据该评估返回结果。

所以对于现代版本从MongoDB的2.6及以上的,你可以$project$map操作者的使用来构建阵列:

db.campaign.aggregate([ 
    { "$project": { 
     "campaignType": { 
      "$map": { 
       "input": { "$literal": [1] }, 
       "as": "el", 
       "in": { 
        "$cond": [ 
         { "$eq": [ "$campaignType", 1 ] }, 
         "APPLICATION", 
         false 
        ] 
       } 
      } 
     }, 
     "allowAcessControl" : 1, 
     "userId": 1 
    }} 
]) 

或通常在大多数版本中,你可以简单地使用$push运营商在$group管道阶段:

db.campaign.aggregate([ 
    { "$group": { 
     "_id": "$_id", 
     "campaignType": { 
      "$push": { 
       "$cond": [ 
        { "$eq": [ "$campaignType", 1 ] }, 
        "APPLICATION", 
        false 
       ] 
      } 
     }, 
     "allowAccessControl": { "$first": "$allowAccessControl" }, 
     "userId": { "first": "$userId" } 
    }} 
]) 

但总的概念,如果您按顺序使用“嵌套”与$cond运营商则表达式来“测试”和r根据您的“映射”条件设定一些值,并与另一个允许您生成数组的运算符一起执行此操作。

+0

很棒,谢谢!我正在使用Talend并因此被迫使用mongo 2.5 .. 我想知道 '{“$ first”:“$ allowAccessControl”}'是什么意思?再次 - 非常感谢! – Leo 2014-09-29 12:54:57

+0

@Leo [**'$ first' **](http://docs.mongodb.org/manual/reference/operator/aggregation/first/)运算符是聚合API中的“分组运算符”。它在该流水线阶段的'_id'中指定的“分组键”中返回“第一个”匹配。 BTW MongoDB 2.5与大多数实现系统一样意味着“开发”修订,因为次版本是奇数。依赖于“开发”版本的任何生产代码都不可靠。 – 2014-09-29 13:11:18