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

У меня есть коллекция «продукт», в которой есть поле «категория». Я пытаюсь подсчитать различные категории. Я не могу использовать db.product.distinct ("category"). Length, так как он превышает 16 МБ с ошибкой ниже: -

> 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 data mongodb. Пожалуйста помоги. Я получаю следующие ошибки с тем, что я пробовал:

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

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


person xabhi    schedule 21.07.2014    source источник


Ответы (1)


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

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

person Neil Lunn    schedule 22.07.2014
comment
Спасибо, Нил, Вы также знаете, кому указывать параметр allowDiskUse в Spring data mongodb? - person xabhi; 22.07.2014
comment
@xabhi Это действительно похоже на другой вопрос. Так что если вам нужна помощь, тогда вам следует задать другой вопрос. Но на самом деле вам нужно посмотреть параметры подписи для агрегированного метода как в общей документации, так и в документации по данным Spring. Ключевое слово здесь - варианты. - person Neil Lunn; 22.07.2014