mongodb - 如何过滤子数组但保留根内容?

标签 mongodb filter aggregation

使用mongo 3.6

我有一个顶级对象,其属性包含内容数组。


      {
        firstName: "first1",
        lastName: "last1",
        phones: [
          {
            name: "home",
            number: "1800"
          },
          {
            name: "work",
            number: "1888"
          }
        ]
      }

我只想返回“工作”电话号码,但保留根内容。

预期结果是:

 {
        firstName: "first1",
        lastName: "last1",
        phones: [
          {
            name: "work",
            number: "1888"
          }
        ]
      }

用例是返回正在服用特定药物的患者,但仅返回这些药物而不是完整的药物列表。

所以我尝试了这个:

 {
    $project: {
      phones: {
        $filter: {
          input: "$phones",
          as: "phones",
          cond: {
            $eq: [
              "$$phones.name",
              "work"
            ]
          }
        }
      }
    }
  }

我必须经常这样做才能删除子数组的元素,因此我们将不胜感激。

最佳答案

以下查询可以获得预期的输出:

db.collection.aggregate([
    {
        $addFields:{
            "phones":{
                $filter:{
                    "input":"$phones",
                    "as":"phone",
                    "cond":{
                        $eq:["$$phone.name","work"]
                    }
                }
            }
        }
    }
]).pretty()

输出:

{
    "_id" : ObjectId("5d56d6c632ac518eee84d462"),
    "firstName" : "first1",
    "lastName" : "last1",
    "phones" : [
        {
            "name" : "work",
            "number" : "1888"
        }
    ]
}

关于mongodb - 如何过滤子数组但保留根内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57527925/

相关文章:

javascript - 将 JavaScript 数组中的相同值分组

mongodb - 没有重复的 Mongoose 帖子

javascript - 无法使用具有 X509 用户的 Mongoose 连接到 Mongo DB

ios - 使用 Coredata 或 NSMutableArray 的 NSPredicate 进行过滤的最佳方法?

MySQL聚合

c# - 解析和格式化最小/最大日期值 - 用于elasticsearch聚合

javascript - 使用 Mongodb 聚合如何将数字更改为月份名称

arrays - 返回空数组

sql-server - 将网上商店存储迁移到 NoSQL 解决方案

javascript - 在 AngularJS : default way 中实现搜索