【发布时间】:2016-09-11 11:38:36
【问题描述】:
我有一个包含 3772 个文档的 restaurants 集合,我正在尝试使用聚合框架计算在 grades 数组的第一个元素中包含 score 的文档总数,该数组是 7 的倍数。
查询:
db.restaurants.aggregate([
{$project: {remainder: {$mod: ["$grades.0.score", 7]},
restaurant_id: 1,
name: 1,
grades: 1
}
},
{$match: {remainder: {$eq: 0}}},
{$group: {_id: null, total: {$sum: 1}}}
])
但是,我收到一条错误消息,原因是在 $project 管道阶段使用了 $mod 运算符。错误信息如下:
$mod 只支持数值类型,不支持 Array 和 NumberDouble
但是,$grades.0.score 和 7 都是整数,对吧?我应该进行哪些更改才能使此查询按预期工作?
示例文档:
{
"_id" : ObjectId("57290430139a4a37132c9e93"),
"address" : {
"building" : "469",
"coord" : [
-73.961704,
40.662942
],
"street" : "Flatbush Avenue",
"zipcode" : "11225"
},
"borough" : "Brooklyn",
"cuisine" : "Hamburgers",
"grades" : [
{
"date" : ISODate("2014-12-30T00:00:00Z"),
"grade" : "A",
"score" : 8
},
{
"date" : ISODate("2014-07-01T00:00:00Z"),
"grade" : "B",
"score" : 23
},
{
"date" : ISODate("2013-04-30T00:00:00Z"),
"grade" : "A",
"score" : 12
},
],
"name" : "Wendy'S",
"restaurant_id" : "30112340"
}
【问题讨论】:
-
您是否需要
$mod仅用于“等级”数组中的第一个元素?你能显示预期的输出吗? -
一直是
"remainder": { "$mod": [ { "$arrayElemAt": [ "$grades.score", 0 ] }, 7 ] }。见$arrayElemAt。投射只会在以后的$group中丢弃的字段也没有任何意义。并且表达式应该是$redact,而不是$project,然后是$match。效率更高。
标签: mongodb mongodb-query aggregation-framework nosql