MongoDB - агрегировать по массиву коллекции

У меня есть коллекция, которая выглядит так:

@Document(collection = "Contact")
public @Data class Contact {

    @Id
    private String id;
    private String institution;
    private List<ContactAddressWithProducts> addressesWithProducts;

и я перечислю все контакты, у которых более одного AddressWithProducts, включая количество адресовWithProducts.length.

Это была моя первая попытка, но она не работает:

db.Contact.aggregate([{$group: { _id: {institution: "$institution"}, count: {$sum: {addressesWithProducts}} }}, {$match: {count: {"$gt": 1} }} ]);

Кто-нибудь знает, как это решить?

[РЕДАКТИРОВАТЬ] Коллекция выглядит так:

{
"_id" : ObjectId("5a12c677c2dc334f8983a045"),
"_class" : "com.my.domain.dao.domain.Contact",
"institution" : "Contact name",
...
"addressesWithProducts" : [
    {
    "products" : [...]  
    "address" : DBRef("Address", ObjectId("59ede65fc2dc768853cc7843"))
    },
    {
    "products" : [...]  
    "address" : DBRef("Address", ObjectId("59ede6522222768853cc7843"))
    }
],


"creationDate" : ISODate("2017-11-20T12:11:00Z"),
"active" : true,
"address" : DBRef("Address", ObjectId("5a12c677c2dc334f8983a044")),
"tenant" : DBRef("Tenant", ObjectId("58500aed747a6cddb55ba094"))
}

И мой ожидаемый результат должен выглядеть так:

{ "_id" : { "institution" : "Contact name" }, "count" : 2 }
{ "_id" : { "institution" : "Contact name 123" }, "count" : 7 }
{ "_id" : { "institution" : "Contact name 5" }, "count" : 4 }
...

Не могли бы вы показать, как выглядят ваши данные? а также ожидаемый результат

Ashh 02.10.2018 10:00

Должен быть db.Contact.aggregate([ { $group: { _id: { institution: "$institution" }, count: { $sum: 1 } }}, { $match: { count: { "$gt": 1 }}} ])

Ashh 02.10.2018 10:20
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
2
209
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Измените свой запрос на следующий:

db['Contact'].aggregate(
    [
        {
            $group: {
            _id: {institution: "$institution"},
            count:{$sum:{$size:{ $ifNull: [ "$addressesWithProducts", [] ] }}}
            }
        },
        {
            $match: {
            count: {"$gt": 1}
            }
        },
    ]
);

большое спасибо!! Я получаю следующую ошибку: assert: command failed: {"ok": 0, "errmsg": "Аргумент $ size должен быть массивом, но имеет тип: отсутствует", "code": 17124, "codeName" : "Location17124"}: агрегат не удалось - могу ли я справиться с этой ошибкой

quma 02.10.2018 11:22

Вероятно, у вас есть документ (ы) без поля addressWithProducts. Чтобы избежать этой ошибки, добавьте этап сопоставления, чтобы проверить, существует ли поле. Я редактирую свой ответ

matthPen 02.10.2018 12:27

Вместо этого (я забыл, что $ exists недоступен в агрегации), добавьте $ ifNull, чтобы угрожать этому случаю (см. Отредактированный ответ)

matthPen 02.10.2018 12:44

Другие вопросы по теме