如何在 mongodb 中获取匹配的子文档
How to get matching subdocuments in 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 })
它只是 returns 第一个匹配的子文档,但还有许多其他文档可用
如果我不使用“.$”,那么它 returns 所有那些文档,甚至那些不符合查询条件的文档。
提前致谢
你可以通过聚合/$filter 来做 simpy:
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”
上创建索引
我有这样的架构 -
{
"_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 })
它只是 returns 第一个匹配的子文档,但还有许多其他文档可用
如果我不使用“.$”,那么它 returns 所有那些文档,甚至那些不符合查询条件的文档。
提前致谢
你可以通过聚合/$filter 来做 simpy:
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”
上创建索引