MongoDB聚合中如何用Bot用户数组过滤目标文档
在MongoDB聚合中筛选属于指定Bot列表的文档
嘿,我懂你要做的事——在聚合管道里精准筛选出user属于指定Bot列表的文档,还要能顺畅衔接后续的聚合操作对吧?其实用$match配合$in就能完美解决,大概率是你之前的写法没到位,我给你一步步说清楚:
首先,先确认你的示例数据(假设集合名为yourCollection):
[ { "user" : "InternetBot", "userid" : 1, "timestamp" : "2020-02-22T00:51:07Z", "title" : "Australia" }, { "user" : "ArchiveBot", "userid" : 31, "timestamp" : "2020-02-22T00:51:07Z", "title" : "Australia" }, { "user" : "David", "userid" : 312, "timestamp" : "2020-02-22T00:51:07Z", "title" : "Another Book" }, { "user" : "Tim", "userid" : 111, "timestamp" : "2020-02-22T00:51:07Z", "title" : "A novel" }, { "user" : "AutoBot", "userid" : 222, "timestamp" : "2020-02-22T00:51:07Z", "title" : "A paint" } ]
你的Bot用户列表是:["InternetBot", "AutoBot", "ArchiveBot"]
接下来就是正确的聚合管道写法,把$match作为第一个阶段(强烈建议放前面,能提前过滤掉不需要的文档,大幅提升后续聚合的性能):
db.yourCollection.aggregate([ // 核心筛选阶段:匹配user在Bot列表中的文档 { $match: { user: { $in: ["InternetBot", "AutoBot", "ArchiveBot"] } } }, // 这里可以直接添加你的后续聚合阶段,比如$group、$project、$sort等等 // 示例:如果要按title分组统计Bot数量 // { // $group: { // _id: "$title", // botCount: { $sum: 1 } // } // } ])
执行这个聚合后,就能得到你想要的结果:
[ { "user" : "InternetBot", "userid" : 1, "timestamp" : "2020-02-22T00:51:07Z", "title" : "Australia" }, { "user" : "ArchiveBot", "userid" : 31, "timestamp" : "2020-02-22T00:51:07Z", "title" : "Australia" }, { "user" : "AutoBot", "userid" : 222, "timestamp" : "2020-02-22T00:51:07Z", "title" : "A paint" } ]
顺便说下你之前可能踩的坑:$filter操作符是用来过滤文档内部的数组字段元素的,比如如果某个文档有一个comments数组,你想筛选出其中符合条件的评论,这时候才用$filter。而你的需求是直接过滤整个文档,所以$match才是正确的工具,别搞混啦~
内容的提问来源于stack exchange,提问作者David Dai
相关产品推荐
相关产品推荐

