Соответствие MongoDB на основе нескольких полей массива - PullRequest
1 голос
/ 21 апреля 2020

Предположим, у меня есть следующие документы:

{
  "_id": "ID1",
  "A": [
    {
    "a": "abc",
    "b": true
    },
    {
    "a": "abc",
    "b": false
    },
    {
    "a": "def",
    "b": true
    }
  ]
}

{
  "_id": "ID2",
  "A": [
    {
    "a": "abc",
    "b": false
    },
    {
    "a": "abc",
    "b": false
    },
    {
    "a": "def",
    "b": true
    }
  ]
}

Как я могу настроить свой запрос:

db.collection.aggregate([
  {$match: {"A.a": "abc"}},
  {$project: {A: 1}}
])

, чтобы я соответствовал только документам, в которых хотя бы один объект находится в A где A.a=abc AND A.b=true? В этом примере результат будет просто:

{
  "_id": "ID1",
  "A": [
    {
    "a": "abc",
    "b": true
    },
    {
    "a": "abc",
    "b": false
    },
    {
    "a": "def",
    "b": true
    }
  ]
}

1 Ответ

1 голос
/ 21 апреля 2020

Вам необходимо использовать $elemMatch

db.collection.aggregate([
  { $match: { A: { $elemMatch: { a: "abc", b: true }}},
  { $project: { A: 1 }}
])

. Можно также использовать find запрос

db.collection.find(
  { A: { $elemMatch: { a: "abc", b: true }},
  { A: 1 }
)
...