Mongoose中数组内布尔值切换异常:仅能true转false如何解决?
解决Mongoose数组中布尔字段双向切换的问题
你的代码无法实现status字段双向切换的核心原因是:!"items.$.status"是对字符串字面量取反,结果永远为false,所以无论原字段值是true还是false,都会被强制设为false。
以下是两种可行的解决方案:
方法一:使用$bit操作符(推荐)
利用布尔值在MongoDB中以0/1存储的特性,通过异或操作实现翻转:
exports.postStatusItemchange = (req, res, next) => { const productId = req.body.productId; const itemId = req.body.itemId; Product.updateOne( { _id: productId, "items._id": itemId }, { $bit: { "items.$.status": { xor: 1 } } } ) .then((result) => { console.log(result); res.send("done"); }) .catch(err => { res.send(err); }); }
$bit的xor操作会将目标字段值与1进行异或计算:01=1(对应`true`),11=0(对应false),完美实现双向切换。
方法二:使用$expr引用当前字段值
通过数组形式的更新操作符,结合$not取反当前字段值:
exports.postStatusItemchange = (req, res, next) => { const productId = req.body.productId; const itemId = req.body.itemId; Product.updateOne( { _id: productId, "items._id": itemId }, [ { $set: { "items.$.status": { $not: "$items.$.status" } } } ] ) .then((result) => { console.log(result); res.send("done"); }) .catch(err => { res.send(err); }); }
这里使用数组包裹更新操作,允许通过$引用匹配到的数组元素,$not直接对当前status值取反,实现双向切换。
内容的提问来源于stack exchange,提问作者Krish
相关产品推荐
相关产品推荐

