MongoDb组如果尚未分组

时间:2017-10-17 15:07:44

标签: mongodb mongodb-query aggregation-framework

试图找出一个语法,使mongoDB组包含尚未被分组的文档,因为它没有通过条件。

文档部分看起来像

{ 
"_id" : ObjectId("value"), 
"updatedAt" : ISODate("value"), 
"zip" : "11209", 
"state" : "NY", 
"city" : "New York", 
}

我创建了互斥的字符串数组,用于匹配其他组,例如

east_ny_zipcodes = ["11209", "11210", "11211", ...]
lower_ny_zipcodes = ["11212", "11213", "11214", ...]

这是来自@Neal Lunn的示例查询,其中包含一些已定义的组和值

db.zips.aggregate([
  { "$group": {
    "_id": null,
    "lower_ny": {
      "$sum": {
        "$cond": [{ "$in": [ "$zip", lower_ny_zipcodes ] },1,0]
      }
    },
    "east_ny": {
      "$sum": {
        "$cond": [{ "$in": [ "$zip", east_ny_zipcodes ] },1,0]
      }
    },
    "upper_ny": {
      "$sum": {
        "$cond": [{ "$in": [ "$zip", upper_ny_zipcodes ] },1,0]
      }
    }
  }}
])

我想创建另一个捕获所有组,这些组将捕获这些定义的组没有的东西,但也给我文档,而不仅仅是计数,所以我可以深入研究它,如

"other_zips":{
   "$push":{
     "$cond": [{ "$nin": [ "$zip", lower_ny, east_ny, upper_ny,...]}]
}

1 个答案:

答案 0 :(得分:1)

您可以尝试以下代码。

all - 包含所有邮政编码的变量

$$ROOT - 完整文件

以下代码将在未找到时推送整个文档,否则将插入null元素。

如果选择,可以在后续阶段过滤空文档。

$addToSet将保留最多一个空文档。

文件:

"other_zips_doc":{
   "$addToSet":{
     "$cond": [{ $not: [ { $in: [ "$zip", all ] } ] }, "$$ROOT", null]
  }
}

计数:

"other_zips_count":{
   "$sum":{
     "$cond": [{ $not: [ { $in: [ "$zip", all ] } ] }, 1, 0]
  }
}