Spring数据相当于mongodb中的以下聚合操作

时间:2014-07-21 13:06:36

标签: java spring mongodb aggregation-framework spring-data-mongodb

我有一个“产品”集合,其中包含“类别”字段。我想要计算不同的类别。 我不能使用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。 我在第二组操作中尝试了其他字符串,但它提供了无效的引用错误。

1 个答案:

答案 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