使用条件分组语句进行MongoDB查询

时间:2015-01-28 11:26:31

标签: mongodb mongodb-query aggregation-framework

我需要从mongoDB的数据库中导出客户记录。导出的客户记录不应具有重复值。 "的firstName + lastName的+代码" DE是欺骗记录的关键,如果数据库中有两条记录存在相同的密钥,那么我需要优先考虑源字段,而不是电子邮件。

customer(id,firstName,lastName,code,source)集合就是这样。

如果有记录3记录具有相同的唯一密钥和3个不同的来源,那么我只需要选择两个来源(电视,互联网)之间的一条记录{或者如果有n个来源我只需要一条记录}不使用'电子邮件'(当只有一条记录带有唯一密钥且来源是电子邮件时,将选择电子邮件) 查询使用:

`db.customer.aggregate([
 { "$match" : { "active" : true , "dealerCode" : { "$in" : [ "111391"]} , "source" : { "$in" : [ "email","TV","internet"]}}},
   {$group:{"_id":{
                  "firstName":"$personalInfo.firstName",
                  "lastName":"$personalInfo.lastName",
                  "code":"$vehicle.code"},              
        "source":{
                   $addToSet:{"source":"$source"}
                 }
        }
    },
    {$redact: 
        {$cond:[{$eq:[{$ifNull:["$source","other"]},"email"]},"$$PRUNE","$$DESCEND"]}
    },
   {$project:
        {"source":
            {$map:
                  {"input":
                       {$cond:[
                         {$eq:[{$size:"$source"},0]},[{"source":"email"}],"$source"]
                        },"as":"inp","in":"$$inp.source"}
            },
            "record":{"_id":1}
        }
    } ])`

示例输出:     { "_id" : { "firstName" : "sGI6YaJ36WRfI4xuJQzI7A==", "lastName" : "99eQ7i+uTOqO8X+IPW+NOA==", "code" : "1GTHK23688F113955" }, "source" : [ "internet" ] } { "_id" : { "firstName" : "WYDROTF/9vs9O7XhdIKd5Q==", "lastName" : "BM18Uq/ltcbdx0UJOXh7Sw==", "code" : "1G4GE5GV5AF180133" }, "source" : [ "internet" ] } { "_id" : { "firstName" : "id+U2gYNHQaNQRWXpe34MA==", "lastName" : "AIs1G33QnH9RB0nupJEvjw==", "code" : "1G4GE5EV0AF177966" }, "source" : [ "internet" ] } { "_id" : { "firstName" : "qhreJVuUA5l8lnBPVhMAdw==", "lastName" : "petb0Qx3YPfebSioY0wL9w==", "code" : "1G1AL55F277253143" }, "source" : [ "TV" ] } { "_id" : { "firstName" : "qhreJVuUA5l8lnBPVhMAdw==", "lastName" : "6LB/NmhbfqTagbOnHFGoog==", "code" : "1GCVKREC0EZ168134" }, "source" : [ "TV", "internet" ] }

这是此查询的问题,请建议:(

1 个答案:

答案 0 :(得分:3)

您的代码不起作用,因为$cond不是累加器运算符。只有these累加器运算符可以在$group阶段使用。

假设您的记录中包含的source值不超过两个,您可以添加一个条件$project阶段并将$group阶段修改为

代码:

db.customer.aggregate([
{$group:{"_id":{"id":"$id",
                "firstName":"$firstName",
                "lastName":"$lastName",
                "code":"$code"},
         "sourceA":{$first:"$source"},
         "sourceB":{$last:"$source"}}},
{$project:{"source":{$cond:[{$eq:["$sourceA","email"]},
                            "$sourceB",
                            "$sourceA"]}}}
])

如果源可能有两个可能的值,那么您可以执行以下操作:

    {li> GroupidfirstNamelastNamecode组成。积累 使用$addToSet运算符{/ 1}}的唯一值。
  • 使用$redact仅保留source以外的值。
  • email必填字段,如果Project数组为空(所有元素都已删除),请添加 价值source
  • email源字段将其列为字段而不是数组。 (可选)

代码:

Unwind