Эквивалент данных Spring операции агрегации ниже в mongodb

1

У меня есть "товарная" коллекция, которая имеет поле "категория". Я пытаюсь получить количество разных категорий. Я не могу использовать 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})

Я не могу перевести это в запрос агрегации весны данных mongodb. Пожалуйста помоги. Я получаю следующие ошибки с тем, что я пробовал:

        Aggregation aggregation = Aggregation.newAggregation(
        Aggregation.group("category"),
        Aggregation.group(" ").count().as("numDistinctCategories"));

Ошибка: AggregationField не может быть нулевым. Я пробовал другие строки во второй группе, но это дает неверную ошибку ссылки.

Теги:
spring
aggregation-framework
spring-data-mongodb

1 ответ

3
Лучший ответ

Лучший способ написать то, что вы пишете здесь, будет в форме оболочки:

db.product.aggregate([
    {"$group": { "_id": "$category", "count": { "$sum": 1 } } }
])

Это дает общее количество баллов за каждую категорию.

Что делает ваша форма запроса, поскольку она отбрасывает группирующую часть и просто учитывает отдельные термины. Но это будет так, как вы на самом деле пишете это, так как это просто случайность, что в JavaScript "строка", которая не является переменной, имеет значение null:

db.product.aggregate([
    { "$group": { "_id": "$category" } },
    { "$group": { "_id": null, , "count": { "$sum": 1 } } }
])

В этом случае ваш способ передачи данных весной:

    Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.group("category"),
            Aggregation.group().count().as("count")
    );
    System.out.println(aggregation);

System.out. там отображается правильно сформированное утверждение.

Попробуйте в оболочке. Нет разницы между "" и "" или "aaaa" без префикса "$", что и делает его ссылкой на поле. Данные Spring обрабатывают "строку" как поле, поэтому не поставляя один равным null

  • 0
    Спасибо, Нил. Вы также знаете, кому указывать опцию allowDiskUse в весенних данных mongodb?
  • 0
    @ xabhi Это звучит как другой вопрос на самом деле. Так что если вам нужна помощь, тогда вам следует задать еще один вопрос. Но на самом деле вам нужно взглянуть на параметры «подписи» для агрегатного метода как в общей документации, так и в документации данных Spring. "варианты", являющиеся ключевым словом здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню