如何在MongoDB中获取聚合查询过滤后的数组长度
问题根因
你当前的写法中,$project阶段计算count时引用的$users是原始文档自带的未过滤数组,自然返回的是原数组总长度。另外MongoDB同一$project阶段内无法直接引用同阶段刚刚定义的新字段,所以不能直接对新生成的users字段计算长度。
解决方案
根据你需要的统计维度,可选择以下两种常用写法:
方案1:统计所有符合过滤条件的用户总数量(不受切片取前100条的限制)
拆分两个$project阶段,先暂存过滤后的完整数组,再分别做切片和长度统计:
db.FlaggedData.aggregate([ { "$match": { "_id": "d86d6b48-e949-4daa-8364-9ef008416ae8" } }, { "$project": { "filteredUsers": { "$filter": { "input": "$users", "as": "users", "cond": { "$and": [ // 此处填写你的过滤条件 ] } } } } }, { "$project": { "users": { "$slice": ["$filteredUsers", 0, 100] }, "count": { "$size": "$filteredUsers" } } } ])
该方案下,就算符合过滤条件的用户超过100条,count也会返回所有符合条件的总数量。
方案2:统计过滤且切片后最终返回的数组长度
如果只需要统计最终返回的100条以内的数组长度,可以用$let表达式在单个$project阶段完成,避免多次遍历数组:
db.FlaggedData.aggregate([ { "$match": { "_id": "d86d6b48-e949-4daa-8364-9ef008416ae8" } }, { "$project": { "users": { "$let": { "vars": { "filtered": { "$filter": { "input": "$users", "as": "users", "cond": { "$and": [ /* 你的过滤条件 */ ] } } } }, "in": { "$slice": ["$$filtered", 0, 100] } } }, "count": { "$size": { "$filter": { "input": "$users", "as": "users", "cond": { "$and": [ /* 和上方完全一致的过滤条件 */ ] } } } } } } ])
内容的提问来源于stack exchange,提问作者Manisekhar Simhadri
相关产品推荐
相关产品推荐

