У меня есть такая схема -
{
"_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 })
он просто возвращает первый соответствующий вложенный документ, но также доступно много других документов
если я не использую ".$", то он возвращает все эти документы, даже те, которые не соответствуют условиям запроса.
заранее спасибо
Вы можете сделать просто с помощью 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?