You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:09:11