MongoDB: $ eq неправильно работает с $ и? - PullRequest
1 голос
/ 27 мая 2020

У меня есть следующие данные:

[
  {
    "_id": "1",
    "people_list": [
      {
        "gender": "female",
        "age": 20,
        "adult": true,
        "hobby": "soccer"
      },
      {
        "gender": "female",
        "age": 20,
        "adult": true,
        "hobby": "football"
      },
      {
        "gender": "female",
        "age": 20,
        "adult": true,
        "hobby": "basketball"
      }
    ]
  },
  {
    "_id": 2,
    "people_list": [
      {
        "gender": "female",
        "age": 20,
        "adult": false,
        "hobby": "soccer"
      },
      {
        "gender": "male",
        "age": 20,
        "adult": true,
        "hobby": "football"
      },
      {
        "gender": "male",
        "age": 20,
        "adult": true,
        "hobby": "basketball"
      },

    ]
  }
]

Я пытаюсь выполнить итерацию через people_list и проверить, все ли элементы внутри могут соответствовать определенным критериям. Поэтому я планирую использовать allElementsTrue. Код будет примерно следующим (скажем, я хочу проверить только adult и age):

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $allElementsTrue: {
          $map: {
            input: "$people_list",
            as: "ppl",
            in: {
              $and: [
                {
                  "$eq": [
                    "$$ppl.adult",
                    true
                  ],
                  "$eq": [
                    "$$ppl.age",
                    20
                  ]
                }
              ]
            }
          }
        }
      }
    }
  }
])

Однако я все равно получаю оба документа "_id": "1" , и "_id": "2" в выводе, несмотря на то, что поле adult первого объекта "_id": "2" s people_list равно false! Не знаю почему. Может ли кто-нибудь дать мне несколько предложений?

Я добавил код в эту игровую площадку для вашего удобства. Спасибо!

1 Ответ

1 голос
/ 27 мая 2020

Ветви $and должны быть отдельными объектами, в то время как в вашем случае это один объект, поэтому применяется только первое условие, попробуйте:

$and: [
    {
        "$eq": [
            "$$ppl.adult",
            true
        ]
    },
    {
        "$eq": [
            "$$ppl.age",
            20
        ]
    }
]

Mon go Playground

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