MongoDB агрегатная цепочка из совпадений - PullRequest
0 голосов
/ 17 апреля 2020

Мой targred должен исключить записи, которые уже были связаны с предыдущей агрегацией совпадений в MongoDb.

В первом матче мне нужно получить записи из двух стран: США и Германии.

Во втором матче мне нужно исключить записи из данной страны, например, США и уровень "Begginer" ", но ведите другие записи из США и Германии. Как это возможно? Пример данных:

[
  {
    country: 'United States',
    personName: 'John',
    level: 'Average',
  },
  {
    country: 'United States',
    personName: 'Rina',
    level: 'Begginer',
  },
  {
    country: 'Germany',
    personName: 'John',
    level: 'Average',
  }
]

Первое совпадение (правильное):

{
  country: {$in: ['United States', 'Germany']}
}

Второе совпадение (неправильное):

{
  $and: [
    { level: { $ne: 'Begginer'} },
    { country: { $eq: 'United States' } },
  ]
}

Я не хочу добавлять массив стран снова на втором этапе матча.

1 Ответ

0 голосов
/ 17 апреля 2020

Вам понадобится $or, чтобы хранить все записи, которые не являются «Соединенными Штатами»:

db.stuff.aggregate([
  { $match: {
      country: {$in: ['United States', 'Germany'] }
    }
  },
  { $match: {
      $or: [
        { country: { $ne: 'United States' } },
        { country: { $eq: 'United States' }, level: { $ne: 'Begginer'} }
      ]
    }
  }
]);

Затем вы можете просто объединить 2 совпадения в один.

db.stuff.aggregate([
  { $match: {
      country: {$in: ['United States', 'Germany'] },
      $or: [
        { country: { $ne: 'United States' } },
        { country: { $eq: 'United States' }, level: { $ne: 'Begginer'} }
      ]
    }
  }
]);

Оба эти запроса выведут:

{
        "_id" : ObjectId("5e999bdee125b211df7f361a"),
        "country" : "United States",
        "personName" : "John",
        "level" : "Average"
}
{
        "_id" : ObjectId("5e999bdee125b211df7f361c"),
        "country" : "Germany",
        "personName" : "John",
        "level" : "Average"
}

https://mongoplayground.net/p/oXBqAzBHzUr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...