Mongodb находит объекты, в которых объект вложенного массива удовлетворяет нескольким полям

#mongodb #mongoose

#mongodb #mongoose

Вопрос:

Я пытаюсь получить группы для пользователя, только если пользователь является частью этой группы и является ее членом true . Вот схема группы

 {
        "isDefault": false,
        "users": [
            {
                "membership": true,
                "userId": "asd1234"
            },
            {
                "membership": false,
                "userId": "asdio21038028355"
            },
            {
                "membership": false,
                "userId": "as2398asjdhj"
            }
        ],
        "uuid": "c4vxitr33a9hb19n05iuqxlv1ycp47",
}
 

Это то, что я пытаюсь получить группы для пользователя

 Group.find({ 'users.membership': true, 'users.userId': 'asdio21038028355' })
 

Ожидаемыми результатами должен быть пустой массив, но он также возвращает указанную выше группу.

Ответ №1:

Чтобы сопоставить элемент массива по нескольким полям, используйте $elemMatch, в противном случае для возврата документа необходимо выполнить только одно совпадение.

https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#op._S_elemMatch

https://mongoplayground.net/p/UB-Z0GX-CYq

 Group.find({
  users: {
    $elemMatch: {
      "membership": true,
      "userId": "asdio21038028355"
    }
  }
})