MongoDB中如何检查指定嵌套expenses文档的assigned与given是否不等
MongoDB 查询:匹配数组中满足多条件的嵌套文档
给定user.expenses集合的文档结构如下:
{ userId: ObjectId("62f332b93753ac926ff6ac62"), expenses: [ { name: 'electricity', assigned: 400, given: 400, }, { name: 'restaurant', assigned: 2100, given: 0, } ] }
查询需求
根据请求传入的userId和expenses.name,检查集合中是否存在满足以下条件的文档:
userId完全匹配expenses数组中存在至少一个嵌套文档,同时满足:name等于指定值assigned不等于given
此前尝试的问题
- 使用
$elemMatch仅实现了name匹配,未加入assigned与given的不等判断,代码如下:
db.user.expenses.find({ userId: ObjectId('62f332b93753ac926ff6ac62'), expenses: { $elemMatch: { name: 'electricity', }, }, });
- 尝试
$where但该运算符仅作用于顶层文档,无法处理数组内嵌套文档的多条件判断。
解决方案
直接在$elemMatch中组合多个条件即可,$elemMatch支持针对数组单个元素设置多条件判断,确保存在至少一个元素同时满足所有要求。
完整查询代码
db.user.expenses.find({ userId: ObjectId('62f332b93753ac926ff6ac62'), expenses: { $elemMatch: { name: 'electricity', $expr: { $ne: ["$assigned", "$given"] } } } });
代码说明
$expr允许在查询中使用聚合表达式,通过$ne判断assigned和given是否不相等$elemMatch确保数组中存在一个元素同时满足name匹配和assigned≠given的条件
如果仅需判断文档是否存在而非返回具体内容,可使用exists()提升效率:
db.user.expenses.exists({ userId: ObjectId('62f332b93753ac926ff6ac62'), expenses: { $elemMatch: { name: 'electricity', $expr: { $ne: ["$assigned", "$given"] } } } });
内容的提问来源于stack exchange,提问作者Tajmirul Islam
相关产品推荐
相关产品推荐

