如何在MongoDB Compass及find方法中查询嵌套数组内level=-1的对象?
没问题!完全可以在MongoDB Compass里实现这个需求,我会一步步给你讲操作方法,同时也提供对应的Mongo Shell查询语句,分两种常见场景说明:
在MongoDB Compass中查询的方法
首先打开Compass,连接到你的数据库,找到ProbCancer集合,然后根据你的需求选择下面的操作:
场景1:找出所有包含level=-1的cases元素的文档
这个场景下,我们只筛选出cases数组里至少有一个元素满足level=-1的文档,返回的文档会保留完整的cases数组:
- 点击顶部的Filter输入框
- 输入以下查询条件:
{ "cases.level": -1 }
- 点击右侧的Find按钮,就能看到符合条件的文档了。
场景2:返回文档时仅保留cases数组中level=-1的元素
如果想让返回的文档里,cases数组只留下level=-1的对象(过滤掉其他level的元素),有两种方式:
方式1:仅返回第一个匹配的元素(用Projection)
这种方式会保留cases数组中第一个level=-1的元素,其他元素会被剔除:
- 在Filter框里输入场景1的筛选条件:
{ "cases.level": -1 } - 切换到顶部的Project选项卡
- 输入投影条件:
{ "cases": { "$elemMatch": { "level": -1 } } }
- 点击Find,就能看到处理后的结果。
方式2:返回所有匹配的元素(用聚合管道)
如果cases数组里有多个level=-1的元素,上面的方式只会返回第一个,这时候用聚合管道可以保留所有匹配的元素:
- 切换到顶部的Aggregation选项卡
- 添加第一个阶段(Stage):选择
$match,输入:
{ "$match": { "cases.level": -1 } }
- 添加第二个阶段:选择
$project,输入:
{ "$project": { "cases": { "$filter": { "input": "$cases", "as": "case", "cond": { "$eq": ["$$case.level", -1] } } }, "_id": 1 // 这里可以添加你需要保留的其他字段,比如其他文档字段写"字段名": 1即可 } }
- 点击Run,就能得到所有cases数组仅包含level=-1元素的文档。
对应的Mongo Shell查询语句
场景1:筛选包含level=-1的cases元素的文档
db.ProbCancer.find({ "cases.level": -1 });
场景2:仅返回cases数组中第一个匹配的元素
db.ProbCancer.find( { "cases.level": -1 }, { "cases": { "$elemMatch": { "level": -1 } } } );
场景3:返回cases数组中所有匹配的元素
db.ProbCancer.aggregate([ { "$match": { "cases.level": -1 } }, { "$project": { "cases": { "$filter": { "input": "$cases", "as": "case", "cond": { "$eq": ["$$case.level", -1] } } }, "_id": 1 // 按需添加其他需要保留的字段 } } ]);
内容的提问来源于stack exchange,提问作者Bentaiba Miled Basma
相关产品推荐
相关产品推荐

