我试图过滤嵌套的对象数组,我只需要匹配属性对象。面对问题,得到我的聚合的预期输出。在示例数据中,顶层有更多的字段,但这些字段并不是此聚合输出所必需的。
样本数据。从上面的数据中,只需要过滤subscribed milestone status并返回它。里程碑对象的最后一个索引总是具有更新的属性,我们需要在此基础上进行检查和筛选。
{
active: 'true',
time:'',
unified_invitees: [
{
_id: 1,
milestone_status: [
{
milestone:"draft"
},
{
milestone:"deleted"
},
]
},
{
_id: 2,
milestone_status: [
{
milestone:"draft"
},
{
milestone:"deleted"
},
]
},
{
_id: 3,
milestone_status: [
{
milestone:"draft"
},
{
milestone:"subscribed"
},
]
},
]
}我尝试过以下解决方案,但似乎没有像预期的那样起作用。
addFields
{
"invitee":{
$filter: { input: "$unified_invitees.milestone_status", cond: { $eq: [ "$$this.milestone", "subscribed" ] } }
}
}{
"unified_invitees": {
"$arrayElemAt": [
{
"$filter": {
"input": "$unified_invitees",
"as": "comp",
"cond": {
"$ne": [ "$$comp.milestone_status.milestone", "deleted" ]
}
}
}, 0
]
}
}filter+map
{
"documents": {
$map: {
"input": "$unified_invitees",
"as": "d",
"in": {
"milestone_status": {
$filter: {
"input": "$$d.milestone_status",
"as": "s",
"cond": {
$eq: [
"$$s.milestone",
"subscribed"
],
}
}
}
}
}
}
}发布于 2022-11-09 13:50:34
您可以使用$anyElementTrue运算符和$map来筛选内部数组:
db.collection.aggregate([
{
$addFields: {
unified_invitees: {
$filter: {
input: "$unified_invitees",
as: "un",
cond: {
$anyElementTrue: {
$map: {
input: "$$un.milestone_status",
as: "ms",
in: { $eq: [ "$$ms.milestone", "subscribed" ] }
}
}
}
}
}
}
}
])$map操作符的作用是返回一个布尔值数组,表示是否将每个milestone_status设置为subscribed。
https://stackoverflow.com/questions/74375842
复制相似问题