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

ASP.NET Core中MongoDB双字段等值校验的更新实现咨询

实现MongoDB双字段校验的更新操作

嗨,我来帮你调整这段代码,实现同时校验transactionId(对应文档_id)和drLedgerId(对应文档ledgerId)的需求~

你只需要在过滤条件里同时添加两个字段的匹配规则就行,MongoDB Driver提供了两种常用的组合方式,都能满足你的需求:

方式1:用&运算符简洁组合条件

这种写法适合简单的多条件场景,代码更紧凑:

public long DebitLedgerBalance(string drLedgerId, string transactionId, decimal amount, string userID)
{
    // 组合双条件:_id等于transactionId 且 ledgerId等于drLedgerId
    var filter = Builders<Transaction>.Filter.Eq(x => x._id, transactionId) 
                & Builders<Transaction>.Filter.Eq(x => x.ledgerId, drLedgerId);

    UpdateDefinition<Transaction> update = Builders<Transaction>.Update
        .Inc(x => x.debitLedgerBalance, amount * -1);

    // 使用组合后的过滤条件执行更新
    return db.Transaction.UpdateOne(filter, update).ModifiedCount;
}

方式2:用And方法组合条件

如果后续需要扩展更多过滤规则,这种方式的可读性更强,便于维护:

public long DebitLedgerBalance(string drLedgerId, string transactionId, decimal amount, string userID)
{
    // 分别定义两个单字段过滤条件
    var idFilter = Builders<Transaction>.Filter.Eq(x => x._id, transactionId);
    var ledgerFilter = Builders<Transaction>.Filter.Eq(x => x.ledgerId, drLedgerId);
    
    // 用And方法组合所有需要的条件
    var filter = Builders<Transaction>.Filter.And(idFilter, ledgerFilter);

    UpdateDefinition<Transaction> update = Builders<Transaction>.Update
        .Inc(x => x.debitLedgerBalance, amount * -1);

    return db.Transaction.UpdateOne(filter, update).ModifiedCount;
}

效果说明

修改后,只有当MongoDB中存在同时满足_id = transactionId和ledgerId = drLedgerId的Transaction文档时,才会执行debitLedgerBalance的递减操作(amount * -1),最终返回实际被修改的文档数量。

内容的提问来源于stack exchange,提问作者Bhavin Varsur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:52:28