我需要显示集合中的值列表。
我有一个具有以下值的集合:
[
{
"Items": [
{
"Key": "Key1",
"Values": [
{
"Value": "Value 1",
"EndDT": "2024-01-31T15:43:53.000Z"
},
{
"Value": "Value 2",
"EndDT": null
}
]
},
{
"Key": "Key2",
"Values": [
{
"Value": "Value 3",
"EndDT": "2024-01-31T15:43:53.000Z"
},
{
"Value": "Value 4",
"EndDT": null
}
]
}
]
},
{
"Items": [
{
"Key": "Key1",
"Values": [
{
"Value": "Value 5",
"EndDT": null
}
]
},
{
"Key": "Key4",
"Values": [
{
"Value": "Value 3",
"EndDT": "2024-01-31T15:43:53.000Z"
},
{
"Value": "Value 4",
"EndDT": null
}
]
}
]
}
]
当我使用聚合检索集合时,我需要结果:
{
$match: {
'Items': {
$elemMatch: {
'Key': 'Key1',
'Values': {
$elemMatch: {
'EndDT': null
}
}
}
}
}
},
结果应如下所示:
[
{
"Items": [
{
"Key": "Key1",
"Values": [
{
"Value": "Value 2",
"EndDT": null
}
]
}
]
},
{
"Items": [
{
"Key": "Key1",
"Values": [
{
"Value": "Value 5",
"EndDT": null
}
]
}
]
}
]
我需要显示 Values EndDT 为空的项目中的值。
这是自动生成的回复
即使像这样使用
$elemMatch
有效,您也只能获得外部元素,其中包括具有“EndDT”非空日期的值。
要获取匹配的数组“Items”并且仅获取“Items.Value”的匹配子数组:
$match
$group
将它们放回一起,一次用于值,然后用于键。这里唯一的要求是每个 Item 的 Key 应该是唯一的。否则,在
$group
期间,它们将位于同一个“Values”数组中:
db.collection.aggregate([
{
$match: {
"Items.Key": "Key1"
}
},
{ $unwind: "$Items" },
{ $unwind: "$Items.Values" },
{
$match: {
"Items.Key": "Key1",
"Items.Values.EndDT": null
}
},
{
$group: {
_id: {
_id: "$_id",
Key: "$Items.Key"
},
Values: { $push: "$Items.Values" }
}
},
{
$group: {
_id: "$_id._id",
Items: {
$push: {
Key: "$_id.Key",
Values: "$Values"
}
}
}
}
])