我正在使用一个包含如下结构对象的 JSON 文件:
[
{
"_id": { "$oid": "65143f76653355483f68981d" },
"date": "2023-09-27",
"certificates": [
{ "cnv2234": { "expiryDate": "2024-08-17" } },
{ "crs14359": { "expiryDate": "2023-09-14" } },
{ "crs14359": { "expiryDate": "2030-03-06" } },
{ "crs14359": { "expiryDate": "2040-02-25" } }
]
}
]
我尝试过各种查询,例如:
query = { "certificates.expiryDate": { "$lte": "2023-09-14" } }
query = { "certificates": { "$elemMatch": { "expiryDate": { "$lte": "2023-09-14" } } } }
query = { "certificates": { "$elemMatch": { "expiryDate": { "$lte": "2023-09-14" } } } }
这些查询均未返回任何数据。虽然我可以成功检索所有数据并单独迭代每个主机和日期,但这对于较大的数据集来说并不实用。当对象没有字段名称时,有人可以指导我如何纠正此查询,以便根据对象数组中的“expiryDate”进行有效过滤吗?
对于您当前的架构,需要考虑一些事项,建议您重构它。
不过,对于你目前的情况,你可以使用
$objectToArray
来查询。
db.collection.aggregate([
{
"$set": {
"certificates": {
"$map": {
"input": "$certificates",
"as": "c",
"in": {
"$objectToArray": "$$c"
}
}
},
"raw": "$$ROOT"
}
},
{
$set: {
"certificates": {
"$reduce": {
"input": "$certificates",
"initialValue": [],
"in": {
"$concatArrays": [
"$$value",
"$$this"
]
}
}
}
}
},
{
"$match": {
"certificates.v.expiryDate": {
"$lte": "2023-09-14"
}
}
},
{
"$replaceRoot": {
"newRoot": "$raw"
}
}
])