mongodb - 投影中的 Mongo Compaas 过滤器
问题描述
最近,我在 Mongo Compass 中创建查询时面临挑战。下面是场景。我在 mongo db 中有一组文档,如下所示:
{
_id :1,
'people':[
{
'grade' : ['A','B'],
'stream': [ {
'stream_id: 'CSE',
'stream_name': 'COMPUTER'
},
{
'stream_id: 'ECE',
'stream_name': 'ELECTRONICS'
},
]
},
{
'grade' : ['B'],
'stream': [ {
'stream_id: 'IT',
'stream_name': 'INFORMATION_TECH'
}
]
}
]
}
我需要找到等级为“A”且流名称为“CSE”的“人”元素。所以基本上我想要这个输出:
{
_id :1,
'people':[
{
'grade' : ['A','B'],
'stream': [ {
'stream_id: 'CSE',
'stream_name': 'COMPUTER'
}
]
]}
我已经尝试了所有 $elemMatch 功能,但它不仅返回了整个文档,而且不仅返回了数组的特定索引。如果有人知道 mongo 指南针,请告诉我。
Mongo 看起来很有趣 :)
解决方案
您可以使用聚合
$unwind
解构数组$match
获得必要的文件,其他人将被淘汰$filter
过滤流,因为我们得到了所有通过条件的文档,我们需要过滤等于条件的流对象$group
重建我们在第一步中已经解构的数组
这是代码
db.collection.aggregate([
{ $unwind: "$people" },
{
$match: {
$expr: {
$and: [
{ $in: [ "A", "$people.grade" ] },
{ $in: [ "CSE", "$people.stream.stream_id" ] }
]
}
}
},
{
$addFields: {
"people.stream": {
$filter: {
input: "$people.stream",
cond: { $eq: [ "$$this.stream_id", "CSE" ] }
}
}
}
},
{
$group: {
_id: "$_id",
people: { $push: "$people" }
}
}
])
工作蒙戈游乐场
推荐阅读
- nginx - 入口控制器不处理流量
- python - 数据框列的正则表达式
- java - 如何将 offsetTime 添加到 UTC 时间以获得正确的 ZonedDateTime?
- java - 如何在 build.bnd 中定义可选分辨率的通用导入包
- monitoring - Prometheus EKS 集群监控
- python - 我想通过在 python 中传递元组列表来创建图像
- google-apps-script - 如何通过 Google App Script 从 Google Cloud Storage 获取上传的文件 URL
- ios - 快速滚动时自定义标题内容动画
- c# - 从不同的表中选择字段
- c# - 如何在 asp.net 中生成刷新令牌?