首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从对象mongodb聚合的嵌套数组中筛选只需要的对象

从对象mongodb聚合的嵌套数组中筛选只需要的对象
EN

Stack Overflow用户
提问于 2022-11-09 13:43:45
回答 1查看 15关注 0票数 1

我试图过滤嵌套的对象数组,我只需要匹配属性对象。面对问题,得到我的聚合的预期输出。在示例数据中,顶层有更多的字段,但这些字段并不是此聚合输出所必需的。

样本数据。从上面的数据中,只需要过滤subscribed milestone status并返回它。里程碑对象的最后一个索引总是具有更新的属性,我们需要在此基础上进行检查和筛选。

代码语言:javascript
复制
{

    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

代码语言:javascript
复制
{
    "invitee":{
          $filter: { input: "$unified_invitees.milestone_status", cond: { $eq: [ "$$this.milestone", "subscribed" ] } }
        }
}
代码语言:javascript
复制
{
  "unified_invitees": {
      "$arrayElemAt": [
          {
              "$filter": {
                  "input": "$unified_invitees",
                  "as": "comp",
                  "cond": {
                      "$ne": [ "$$comp.milestone_status.milestone", "deleted" ]
                  }
              }
          }, 0
      ]
  }
}

filter+map

代码语言:javascript
复制
{
    "documents": {
      $map: {
        "input": "$unified_invitees",
        "as": "d",
        "in": {
          "milestone_status": {
            $filter: {
              "input": "$$d.milestone_status",
              "as": "s",
              "cond": {
                $eq: [
                  "$$s.milestone",
                  "subscribed"
                ],
              }
            }
          }
        }
      }
    }
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-09 13:50:34

您可以使用$anyElementTrue运算符和$map来筛选内部数组:

代码语言:javascript
复制
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

MongoDB游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74375842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档