Как получить соответствующие вложенные документы в mongodb

У меня есть такая схема -

 {
   "_id":"ObjectId(""622f950e73043487031bb3ee"")",
   "outerTimeStamp" : "14-Mar-2022",
   "filtered":{
      "data":[
         {
            "Price":14350,
            "expiryDate":"17-Mar-2022",
            "info1":{
               "Price":14350,
               "expiryDate":"17-Mar-2022",
            },
            "info2":{
               "Price":14350,
               "expiryDate":"17-Mar-2022"
            }
         },
         {
            "Price":14350,
            "expiryDate":"17-Mar-2022",
            "info1":{
               "Price":14350,
               "expiryDate":"17-Mar-2022",
            },
            "info2":{
               "Price":14350,
               "expiryDate":"17-Mar-2022"
            }
         },
         ......
         ....
     ]
    }
}

Мне нужны все вложенные документы из документа, где expiryDate == "17-Mar-2022"

Я использовал следующий запрос -

db.collection.find({ "filtered.data" : { $elemMatch : { "expiryDate" : "17-Mar-2022"}} }, { "filtered.data.$" : 1 })

он просто возвращает первый соответствующий вложенный документ, но также доступно много других документов

если я не использую ".$", то он возвращает все эти документы, даже те, которые не соответствуют условиям запроса.

заранее спасибо

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать просто с помощью aggregation/$filter:

db.collection.aggregate([
{
  $match: {
  "filtered.data.expiryDate": "17-Mar-2022"
  }
},
{
 $addFields: {
  "filtered.data": {
    "$filter": {
      "input": "$filtered.data",
      "as": "d",
      "cond": {
        "$eq": [
          "$$d.expiryDate",
          "17-Mar-2022"
        ]
       }
     }
    }
  }
 }
])

Для достижения наилучших результатов индекс необходимо создать на «filtered.data.expiryDate».

детская площадка

Этот запрос работает нормально, но частично решает мою проблему, возможно ли выполнить запрос mongo DB для определенного документа, а не для всех документов, присутствующих в индексе, или его можно решить без Agg?

Mukul Varshney 19.03.2022 20:37

Я просто добавил еще один фильтр в матч, после чего он начал работать

Mukul Varshney 23.03.2022 04:25

Другие вопросы по теме