mongodb - 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
}
]
}
解决方案
您可以在按字段匹配后使用$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"
]
]
}
}
}
}
}
])
推荐阅读
- python - Keras model.fit() 方法中的 class_weight 参数返回 InvalidArgumentError: 2 root error(s) found
- django - 在 django 的分页期间未设置 COUNT 字段
- matlab - 如何获取 matlab 的 mexcuda 命令以在 ubuntu 20.04 中定位 gcc 版本 8?
- sql - SQL查询计算每30分钟列出的消耗读数,需要按日期时间戳和仪表序列号DESC排序
- python - 想知道如何连接opencv网络摄像头左上角图像中显示的线条
- javascript - 根据排序顺序首先按特定元素类型对数组进行排序
- vba - 如何在 Word for Mac 上应用 SaveAs?
- git - Julia:如何更改包的分支
- mininet - 是否可以在 mininet 中模拟总线拓扑?
- elasticsearch - 更新在 Elasticsearch 中是如何工作的?