聚合mongodb中具有多个条件的addToSet

聚合mongodb中具有多个条件的addToSet,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有这样的文档: { "_id" : ObjectId("5dc3c093c05bd833c4258e25"), "subscriber_id" : 4504, "user_country" : "India", "event" : "eventA" }, { "_id" : ObjectId("5dc3c093c05bd833c4258e25"), "subscriber_id" : 4504, "user_country"

我有这样的文档

  {
    "_id" : ObjectId("5dc3c093c05bd833c4258e25"),
    "subscriber_id" : 4504,
    "user_country" : "India",
    "event" : "eventA"
  },
  {
    "_id" : ObjectId("5dc3c093c05bd833c4258e25"),
    "subscriber_id" : 4504,
    "user_country" : "India",
    "event" : "eventB"
  }
从下面查询我得到:

db.collection.aggregate( 
   { 
      $project:{ 
         _id:1,
         user_country:1,
         subscriber_id:1,
         event:1
      }
   },
   { 
      $group:{ 
         "_id":{ 
            "subscriber_id":"$subscriber_id",
            "eventA":{ 
               $cond:{ 
                  "if":{ 
                     "$and":[ 
                        { 
                           "$eq":[ 
                              "$event",
                              "eventA"
                           ]
                        }
                     ]
                  },
                  then:1,
                  else:0
               }
            },
            "eventB":{ 
               $cond:{ 
                  "if":{ 
                     "$and":[ 
                        { 
                           "$eq":[ 
                              "$event",
                              "eventB"
                           ]
                        }
                     ]
                  },
                  then:1,
                  else:0
               }
            }
         }
      }
   },
   { 
      $group:{ 
         "_id":{ 
            "subscriber_id":"$_id.subscriber_id"
         },
         "event_details":{ 
            $push:{ 
               "eventA":"$_id.eventA",
               "eventB":"$_id.eventB"
            }
         }
      }
   }
);
输出:

{ 
   "_id":{ 
      "subscriber_id":4504
   },
   "event_details":[ 
      { 
         "eventA":0,
         "eventB":0
      },
      { 
         "eventA":1,
         "eventB":0
      },
      { 
         "eventA":0,
         "eventB":1
      }
   ]
}
现在,我希望对于每一行,无论事件的
1
值是多少,都应该推送到数组中,所以下一步的输出应该是这样的

{ 
   "_id":{ 
      "subscriber_id":4504
   },
   "event_details":[ 
      "eventA",
      "eventB"
   ]
}

这里的
eventA
eventB
都有值
1
,所以都会推送到数组中。

为什么这么复杂?你只需要有一个小组阶段就可以实现你所需要的:

db.collection.aggregate([
  {
    $group: {
      _id: "$subscriber_id",
      event_details: {
        $addToSet: "$event"
      }
    }
  }
]
将输出:

[
  {
    "_id": 4504,
    "event_details": [
      "eventB",
      "eventA"
    ]
  }
]