2017-10-12 35 views
0

尝试构建一个聚合查询,以便我可以对邮编进行分类并返回每个组的计数。如果邮编包含数组中的值,则将邮编组编码为新类别

的docuement看起来部分像

{ 
"_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, ...] 

理想地返回类似的n个比较的阵列

{ 
lower_ny: 1200, 
upper_ny: 1500, 
east_ny: 2000 
} 
+1

您可以使用'$ group'和'$ cond'并比较每个类别在它自己的cond中的数组。像'db.collection_name.aggregate({ “$组”:{ “_id”:空, “east_ny”:{ “$总和”:{ “$ COND”:在[ { “$ “:[ “$拉链”, “east_ny_zipcodes” ] }, 1,] } } } })'。你可以用'$或'添加'$ match'阶段来限制在管道中处理的邮政编码。 – Veeram

回答

1

从3.4开始,使用MongoDB,您可以使用$in得到一个比较数组:

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] 
     } 
    } 
    }} 
]) 

如果你没有那么再有就是因为MongoDB的2.6 $setIsSubset。语法和意图略有不同。但是,你的列表是“独一无二”的,所以它不是一个问题:

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

它在本质上只是为了你的外部定义的数组内容,其中获取发送作为操作BSON内容扩展逻辑比较。

当然,您的数组中的值也必须是“字符串”才能匹配。但是,如果您还没有完成,那很容易:

east_ny_zipcodes = [11209, 11210, 11211, ...].map(n => n.toString()); 
+0

是否有可能让它返回每个类别的计数,还有像正常的$ eq查询那样的分组项目列表。想要做一次抽查以确保它是正确的。 谢谢!我正在使用$ in操作符,但没有先使用$ cond。感谢您的澄清。 –

+0

@MeirSnyder你似乎在寻找['$ push'](https://docs.mongodb.com/manual/reference/operator/aggregation/push/),这是另一个累加器,它可以从与分组边界匹配的项目。请注意,16MB限制仍然适用,因此如果您正在构建包含数组内容的分组文档,从而违反了该规则,则会出错。或者'$ in'只是返回一个布尔值,所以你可以总是使用'$ project'或'$ addFields'来进行布尔评估,而不需要任何分组。 –