Как получить элементы массива, которого нет в другом массиве в конвейере агрегации MongoDB? - PullRequest
1 голос
/ 13 июля 2020

У меня есть два массива, как показано ниже:

LastOneYearCustomerIds:[1,2,3,4,5,6,7,8]
ThisMonthCustomerIds:[1,2,3,4,9,10]

Мне нужно найти идентификаторы новых клиентов, которых не было в прошлом году. Я попытался создать один конвейер в MongoDB Compass, но это даст разницу, я ищу что-то, что может возвращать мне элементы в ThisMonthCustomerIds, но не в LastOneYearCustomerIds. Я также пробовал следить за другими сообщениями о переполнении стека, но не смог найти подходящего решения.

Ожидаемый результат:

NewCustomerIds:[9,10]

Я пробовал под конвейером агрегации, который даст мне разницу, но не новый CustomerIds:

$project: {
  newCustomerIds:{
    $setDifference:
    ['$LastOneYearCustomerIds','$ThisMonthCustomerIds'
  ]}
}

1 Ответ

2 голосов
/ 13 июля 2020

Оператор $setDifference будет работать. Вы разместили имена ключей в неправильном порядке.

Первым должен быть массив, элементы которого вы хотите сохранить, а затем массив, с которым вы хотите сравнить.

db.test10.aggregate([
    {
        "$project": {
            "newCustomerIds": {
                "$setDifference": ["$ThisMonthCustomerIds", "$LastOneYearCustomerIds"]
            }
        }
    }
])

Выше запрос вернет результат:

{
    "_id" : ObjectId("5f0bfcc55e654d34080a9282"),
    "newCustomerIds" : [
        9,
        10
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...