首页 > 解决方案 > MongoDB如何只为文档选择特定的子元素?

问题描述

在 MongoDB 中,我有这样的文档:

{
  "_id" : ObjectId("5cc9f3c87aa1024e079a3abf"),
  "created_at" : ISODate("2019-04-01T00:00:00.000Z"),
  "demographics" : [  
    {
      "key" : "gender",
      "value" : "male"
    }, 
    {
      "key" : "birth_year",
      "value" : 1992
    }, 
    {
      "key" : "city_or_rural",
      "value" : "rural"
    }, 
    {
      "key" : "car_purchase_intention",
      "value" : "no"
    }, 
    {
      "key" : "education_level",
      "value" : "high"
    }, 
    {
      "key" : "age",
      "value" : 26
    }
  ]
}

我想通过“created_at”进行查询,但是对于结果中的每个文档,只返回关键是“年龄”或“性别”的人口统计元素。

我正在尝试组合,$unwind$project我无法获得任何正确的结果。

我期待这样的结果:

# 1
{
  "_id" : ObjectId("5cc9f3c87aa1024e079a3abf"),
  "created_at" : ISODate("2019-04-01T00:00:00.000Z"),
  "demographics" : [  
    {
      "key" : "gender",
      "value" : "male"
    }, 
    {
      "key" : "age",
      "value" : 26
    }
  ]
}

# 2
{
  "_id" : ObjectId("5cc9f3c87aa1024e079axxx"),
  "created_at" : ISODate("2019-04-01T00:00:00.000Z"),
  "demographics" : [  
    {
      "key" : "gender",
      "value" : "female"
    }, 
    {
      "key" : "age",
      "value" : 56
    }
  ]
}

标签: mongodbaggregation-framework

解决方案


您可以在按字段匹配后使用$filter聚合。created_at

$filter根据指定的条件选择要返回的数组子集,并返回一个仅包含与条件匹配的元素的数组。

db.collection.aggregate([
  {
    $match: {
      created_at: ISODate("2019-04-01T00:00:00.000Z")
    }
  },
  {
    $project: {
      created_at: "$created_at",
      demographics: {
        $filter: {
          input: "$demographics",
          as: "item",
          cond: {
            $in: [
              "$$item.key",
              [
                "gender",
                "age"
              ]
            ]
          }
        }
      }
    }
  }
])

操场


推荐阅读