Теги GROUP BY в массиве тегов внутри чужой коллекции - PullRequest
0 голосов
/ 10 июня 2019

Я ищу в группе collection1 по тегам, которые находятся в collection2, две коллекции должны быть объединены (поиск) по 2 полям (field1, field2)

До сих пор я придумал следующий запрос:

db.collection1.aggregate([
{
        "$lookup": {
            "from": "collection2",
            "let": { _field1: '$field1', _field2: '$field2' },
            "pipeline": [{
                "$match": {
                    "$expr": {
                        "$and": [
                            { "$eq": ["$field1", "$$_field1"] },
                            { "$eq": ["$field2", "$$_field2"] }
                        ]
                    }
                }
            },
            { "$project": { _id: 0, tags: 1 } },
            ],
            "as": "col2"
        }
    },
    { "$unwind": "$col2" },
    { $group: { _id: "$col2.tags", count: { $sum: 1 } } }

    ]);

Я не получил никакого результата.

field1 и field2 вместе уникальны в collection2 (с уникальным индексом)

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

хорошо, мне удалось решить это самостоятельно.

  1. я добавил уникальный индекс для collection2 (filed1, field2)
  2. добавил дополнительное разматывание для выравнивания массива тегов

мой последний запрос выглядит следующим образом:

 db.collection1.aggregate([
{
        "$lookup": {
            "from": "collection2",
            "let": { field1: '$field1', field2: '$field2' },
            "pipeline": [{
                "$match": {
                    "$expr": {
                        "$and": [
                            { "$eq": ["$field1", "$$field1"] },
                            { "$eq": ["$field2", "$$field2"] }
                        ]
                    }
                }
            },
            { "$project": { _id: 0, tags: 1 } },
            ],
            "as": "col2"
        }
    },
    { "$unwind": "$col2" },
    { "$unwind": "$col2.tags" },
    { $group: { _id: "$col2.tags", count: { $sum: 1 } } }
{ $sort: { count: -1 } },
    ]);
0 голосов
/ 10 июня 2019

Ваш синтаксис правильный, кроме имени ваших переменных в:

{ _field1: '$field1', _field2: '$field2' },

Когда вы определяете такие переменные, они называются пользовательские переменные и mongoимеет определенные ограничения именования, которые отличаются от соглашения о «реальных» переменных.

из документов:

Имена переменных пользователя должны начинаться со строчной буквы ascii [az] илине ascii символ.

Значение в вашем случае подчеркивание вызывает ошибку.

...