@yuriyant
web программист

Mongodb и поиск во вложенных документах?

Допустим есть документ коллекции такого вида:
{
       "objects": [
         {
           "a": 1,
           "prop":2,
         },
         {
           "a": 2,
           "prop":3
         } 
        ] 
}

Есть задача найти документы имеющие вложенные документы с одинаковыми свойствами. Допустим нужно найти документ который содержит два вложенных документа со свойством а == 1
Я построил условие:
{
     	"objects": { "$elemMatch": { "$and": [ {"a":1}, { "a":1} ]} }
}

Этот запрос как и ожидается вернет мне документ, где есть любые вложенные документы со свойством а:1 и а = 2 и т.д.. А вот как бы составить запрос, что бы он вернул мне только те документы, где есть два вложенных документа со свойствами а=1 и их должно быть обязательно столько, сколько условий мы написали.
В идеале должен вернуть документы только такого вида.
{
       "objects": [
         {
           "a": 1,
           "prop":5
         },
         {
           "a": 1,
           "prop":6 
         } 
        ] 
}

Буду очень признателен за любые подсказки
  • Вопрос задан
  • 2289 просмотров
Решения вопроса 1
@yuriyant Автор вопроса
web программист
Вообщем есть решение задачи и оно такое:

db.test.aggregate([
  {
    "$redact": {
      "$cond": [
        {
          "$eq": [
            {
              "$size": {
                "$filter": {
                  "input": "$objects",
                  "as": "item",
                  "cond": {
                    "$eq": [
                      "$$item.a",
                      1
                    ]
                  }
                }
              }
            },
            2
          ]
        },
        "$$KEEP",
        "$$PRUNE"
      ]
    }
  }
])
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
crazyzubr
@crazyzubr
Python backend-developer
db.users.find({'objects': {$elemMatch: {'a': 1}, $size: 2}})
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы