Объединение фильтра соответствия в агрегации

mongodb #mongodb-query #aggregation-framework

#mongodb #mongodb-запрос #агрегация-фреймворк

Вопрос:

Если у меня есть объект Post с двумя свойствами

  • Title типа string
  • IsHomePage типа boolean
  • IsTagged типа boolean

Сценарий: общее количество документов равно 100. Те IsHomePage , для которых установлено значение true is 20 in total , остальные ( 80 in total документы) — это документы со свойством IsTagged , установленным на true .

как я могу создать запрос для выбора всех 20 с помощью IsHomePage и случайных документов, для которых IsTagged установлено значение true с ограничением 50?

Комментарии:

1. Кажется, достаточно тривиальной находки . Требуется ли какая-либо специальная логика? возможно, вы захотите уточнить больше, предоставив пример ожидаемого конечного результата данных.

2. @ray, да, я просто обновляю вопрос

3. и причина, по которой я прошу пример агрегации, заключается в том, что я хочу использовать power of sample operator для выбора случайных документов

Ответ №1:

Вы можете использовать $unionWith для объединения ваших 2 логики.

 db.collection.aggregate([
  {
    "$match": {
      IsHomePage: true
    }
  },
  {
    "$unionWith": {
      "coll": "collection",
      "pipeline": [
        {
          "$match": {
            IsHomePage: {
              $ne: true
            },
            IsTagged: true
          }
        },
        {
          "$sample": {
            "size": 50
          }
        }
      ]
    }
  }
])
 

Вот игровая площадка Mongo для вашей справки.