MongoDB使用$push向数组添加指定文档时报错,求问题原因
问题分析与解决方法
错误原因
- 语法错误:
updateMany的第二个参数必须是完整的JSON对象,你写的$push未被{}包裹,直接作为参数传递,导致语法解析失败,这就是抛出"unexpected token expected: ",""的直接原因。 - 查询条件逻辑错误:原查询条件
{"instock.warehouse": {$ne: "C"}}的逻辑是匹配数组中至少有一个warehouse不等于"C"的文档,但你的需求是匹配数组中完全不存在warehouse为"C"的文档,这个条件会误匹配那些同时包含C和其他仓库的文档(比如"journal")。 - 数值格式问题:
qty: 04是无效的数字写法,MongoDB会自动将其转换为数字4,如果需要保留前导零的字符串格式,应该写成qty: "04"。
无关说明
这个错误和位置操作符$完全无关,位置操作符用于定位数组中匹配的元素进行更新,你的场景不需要用到它。
正确代码示例
方法一:使用$nin匹配不存在的元素
db.inventory.updateMany( {"instock.warehouse": {$nin: ["C"]}}, {$push: {"instock": {"warehouse": "C", "qty": 4}}} )
方法二:使用$not+$elemMatch精确匹配
db.inventory.updateMany( {"instock": {$not: {$elemMatch: {warehouse: "C"}}}}, {$push: {"instock": {"warehouse": "C", "qty": "04"}}} // 保留前导零的字符串格式 )
内容的提问来源于stack exchange,提问作者Azima
相关产品推荐
相关产品推荐

