Запрос на возврат результатов, когда все объекты в массиве объектов совпадают - PullRequest
0 голосов
/ 20 июня 2020

Моя структура документа выглядит так:

users : [
  {_id:1,
  'name': 'xxxxx',
  'children':[
    {age:13, weight: 80 lbs},
    {age: 12, weight: 65 lbs}
  ]
  }
  {_id:2,
  'name': 'yyyyy',
  'children':[
    {age:11, weight: 65 lbs},
    {age: 9, weight: 55 lbs}
  ]
  }
]

Я пытаюсь получить объекты, всем элементам в дочернем массиве которых меньше 12 лет. поэтому ожидаемый результат будет выглядеть примерно так:

[
  {_id:2,
      'name': 'yyyyy',
      'children':[
        {age:11, weight: 65 lbs},
        {age: 9, weight: 55 lbs}
      ]
      }
]

Я пробовал elem match, но он ищет только любые совпадения в массиве. Ищу все совпадения. Я пробовал это, но это не сработало.

{"children":{"$all":[{"$elemMatch":{"age":{"$lte":12}}}]}}

1 Ответ

1 голос
/ 20 июня 2020
db.collection.aggregate([
  { 
      $match: { 
          $expr: { 
              $eq: [ { $reduce: { input: "$children", 
                                  initialValue: true, 
                                  in: { $cond: [ { $gte: [ "$$this.age", 12 ] }, "$$value", false ] }
                     } },                   
                     true 
              ] 
          } 
      } 
  }
])

Агрегирование использует оператор массива $ reduce , чтобы проверить, все ли элементы в массиве children имеют age больше или равное 12. Операция сокращения возвращает логическое значение true или false (истинно, только если все элементы массива совпадают). Этап $match фильтрует документы с результатом true.

...