MongoDB中$nin操作符的正确用法:过滤read_by数组不含指定用户ID的记录
正确实现方案
写法1(推荐,逻辑清晰适配多条件匹配场景)
假设当前用户ID为60b968dc5150a20015d6fcae,查询语句如下:
db.yourCollectionName.find({ type: "admin", read_by: { $not: { $elemMatch: { readerId: "60b968dc5150a20015d6fcae" } } } })
写法2(更简洁的点语法写法)
db.yourCollectionName.find({ type: "admin", "read_by.readerId": { $ne: "60b968dc5150a20015d6fcae" } })
原写法出错原因
你之前用$nin没有得到正确结果,是因为$nin是直接匹配数组元素本身的值,而你的read_by数组存储的是对象,不是纯字符串ID,所以永远无法匹配到目标用户ID,自然返回0条结果。
上面两种写法的逻辑都是要求read_by数组中不存在任何一个元素的readerId字段等于当前用户ID,符合你的筛选要求,对于示例中的第二条数据,因为read_by内的空对象没有匹配的readerId,会正常返回。
内容的提问来源于stack exchange,提问作者sikarak
相关产品推荐
相关产品推荐

