MongoDB多条件更新报错‘unknown top level operator: $eq’求指导
解决MongoDB更新语句中的"unknown top level operator: $eq"错误
嘿,我来帮你搞定这个问题!你遇到的错误是因为对MongoDB查询操作符$eq的用法理解有点偏差——$eq不能作为顶层查询条件来使用,它需要嵌套在具体的字段下面。
错误原因分析
你原来的语句里,把{"$eq":{"item.price":2.80}}作为$and数组里的一个独立条件,这就相当于把$eq当成了顶层操作符,但MongoDB不允许这么做。$eq是用来明确指定字段等于某个值的操作符,必须绑定到具体字段上。
正确的实现方式
这里有两种可行的写法,你可以根据习惯选择:
写法1:直接使用键值对(推荐,更简洁)
对于等于匹配,MongoDB允许直接用字段: 值的形式,不需要显式写$eq:
db.shop.update( { "$and": [ {"item.name": "Milk"}, {"item.price": 2.80} ] }, {"$set": {"item.expiry": "21/10/19"}} );
甚至因为$and在多个查询条件并列时是默认生效的,你还可以简化成更清爽的版本:
db.shop.update( { "item.name": "Milk", "item.price": 2.80 }, {"$set": {"item.expiry": "21/10/19"}} );
写法2:显式使用$eq(适合复杂场景)
如果你确实需要显式使用$eq(比如在更复杂的查询逻辑里,和其他操作符配合),需要把它嵌套在对应的字段下面:
db.shop.update( { "$and": [ {"item.name": "Milk"}, {"item.price": {"$eq": 2.80}} ] }, {"$set": {"item.expiry": "21/10/19"}} );
额外实用提示
另外,如果你想更新所有匹配条件的文档,而不是默认只更新第一个,记得加上multi: true选项:
db.shop.update( {"item.name": "Milk", "item.price": 2.80}, {"$set": {"item.expiry": "21/10/19"}}, {multi: true} );
MongoDB 3.2及以上版本也可以用语义更清晰的updateMany()方法替代:db.shop.updateMany(...)
内容的提问来源于stack exchange,提问作者pekingduct
相关产品推荐
相关产品推荐

