使用$ project返回一个数组

时间:2014-09-29 11:49:17

标签: mongodb mongodb-query aggregation-framework

我有一个包含以下文档的集合:

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

我想使用聚合框架查询此集合,结果如下:

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

你会注意到:

  • campaignType字段变为和数组
  • 数值已映射到字符串

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

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

请帮忙。

由于

1 个答案:

答案 0 :(得分: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运算符,以“测试”并返回一些符合您的“映射”条件的值,并与另一个允许您的运算符执行此操作产生一个数组。