我有一个“产品”集合,其中包含“类别”字段。我想要计算不同的类别。 我不能使用db.product.distinct(“category”)。长度因为它超过16mb的上限而且有以下错误: -
> db.product.distinct("category").length
2014-07-21T08:58:25.289-0400 distinct failed: {
"errmsg" : "exception: distinct too big, 16mb cap",
"code" : 17217,
"ok" : 0
} at src/mongo/shell/collection.js:1108
所以,我正在使用聚合框架,我可以使用这个查询来计算: -
db.product.aggregate([{$group: {_id:"$category"}}, {$group: {_id:"", count:{$sum:1}}}], {allowDiskUse: true})
我无法将其转换为spring数据mongodb聚合查询。请帮忙。 我正在尝试以下错误:
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.group("category"),
Aggregation.group(" ").count().as("numDistinctCategories"));
错误:AggregationField不能为null。 我在第二组操作中尝试了其他字符串,但它提供了无效的引用错误。
答案 0 :(得分:3)
写下你在这里写的内容的更好方法是shell格式:
db.product.aggregate([
{"$group": { "_id": "$category", "count": { "$sum": 1 } } }
])
其中提供了每个类别的总计数。
您的查询表单的作用是什么,因为它会抛出分组部分,只计算不同的术语。但这就是你真正写它的方式,因为这只是一个侥幸,在JavaScript中,不是变量的“字符串”评估为null
:
db.product.aggregate([
{ "$group": { "_id": "$category" } },
{ "$group": { "_id": null, , "count": { "$sum": 1 } } }
])
在这种情况下,你的spring数据写作方式是:
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.group("category"),
Aggregation.group().count().as("count")
);
System.out.println(aggregation);
System.out.
会显示正确形成的陈述。
在shell中试试。没有前缀“$”的“”和“”或“aaaa”之间没有区别,这使得它成为字段引用。 Spring数据将“字符串”视为一个字段,因此不提供一个等于null