如何编写MongoDB Mongoose查询同时匹配ClientId与StockName?
解决方案:多条件AND查询库存条目
当然可以!MongoDB的查询语法本身就支持多条件的逻辑AND——你只需要在查询对象里同时指定这两个条件就行,MongoDB会自动把它们当作AND关系处理,完全满足你的需求。
修改后的查询代码
把原来的findOne查询条件从仅匹配ClientId,改成同时包含ClientId和StockName的对象即可。这里假设你已经从请求中获取到了要匹配的stockName字符串(比如从请求体、URL参数或查询参数里取,具体看你的路由设计):
// 先获取要匹配的StockName,示例从请求体获取 const stockName = req.body.stockName; Stock.findOne({ ClientId: clientId, StockName: stockName // 新增的StockName匹配条件 }, (err, stock) => { if (err) { return res.status(500).json({ err, message: '查询库存时发生错误!' }); } if (!stock) { // 这里建议直接判断stock是否存在,比依赖err更准确 return res.status(404).json({ message: '未找到匹配的库存条目!' }); } // 优化:直接累加(后面会说为什么不用判断undefined) stock.ConsumedQuantity += materialConsumed; stock.WastageQuantity += materialWasted; stock .save() .then(() => { return res.status(200).json({ success: true, message: '库存物料已更新!' }); }) .catch(error => { return res.status(500).json({ error, message: '库存物料更新失败!' }); }) })
关键说明
多条件AND的两种写法
- 简洁写法:像上面那样直接在查询对象里写多个键值对,MongoDB默认会把它们当作逻辑AND处理,只有同时满足所有条件的文档才会被匹配。
- 显式写法(适合复杂场景):如果后续需要更复杂的逻辑组合,也可以用
$and操作符显式声明,效果完全一样:Stock.findOne({ $and: [ { ClientId: clientId }, { StockName: stockName } ] }, ...)
额外优化建议
你当前代码里需要判断ConsumedQuantity和WastageQuantity是否为undefined,其实可以在Stock Schema中给这两个字段设置默认值0,这样新创建的文档会自动带上初始值,后续就不需要额外判断了:const Stock = new Schema( { ClientId : {type : Schema.ObjectId}, ClientName : {type : String}, StockName : { type : String }, StockType : { type : String }, ConsumedQuantity : {type : Number, default: 0}, // 添加默认值0 TotalQuantity : {type : Number}, WastageQuantity : {type : Number, default: 0}, // 添加默认值0 }, { timestamps: true });这样无论库存条目是新创建的还是已存在的,都可以直接执行累加操作,代码会更简洁。
内容的提问来源于stack exchange,提问作者sublime_archon
相关产品推荐
相关产品推荐

