在我的收藏中,只有一份文件。
> db.c20160712.find()
{ "_id" : ObjectId("57ab909791c3b3a393e9e277"), "Dimension_id" : 2, "Attribute" : "good", "Hour" : "20160712_06", "Frequency_count" : 100
字符串
我想运行updateOne
来用另一个文档替换这个文档。但是为什么会有Error: the update operation document must contain atomic operators
呢?
> db.c20160712.updateOne( { "Attribute" : "good"}, {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action"}, { upsert: true} )
2016-08-10T16:37:57.089-0400 E QUERY [thread1] Error: the update operation document must contain atomic operators :
DBCollection.prototype.updateOne@src/mongo/shell/crud_api.js:493:1
@(shell):1:1
型
上述命令中的第二个和第三个参数来自于《MongoDB的实践指南:处理大数据的完整指南.》中的一个示例,作者:Eelco Plugge、大卫豪斯、彼得·斯佩里、蒂姆·霍金斯
我的MongoDB是3.2。
5条答案
按热度按时间wswtfjt71#
第二个参数语法错误,请检查the docs,应为:
字符串
ne5o7dgx2#
我相信这是由于除了
update()
和updateMany()
之外还引入了updateOne()
方法的副作用而改变的,这是为了防止用户意外地覆盖整个文档。您可以使用
replaceOne()
方法,或者不指定multi:true
的update()
方法。anauzrmj3#
你应该使用这段代码,因为我也面临着同样的问题,然后我使用了这段代码:
字符串
你还应该定义**
ObjectID
**,否则问题会再次出现。型
fzwojiic4#
有
"replaceX"
方法和"updateX"
方法。@Alex Blex的答案是 * 更新 * 类型,而PO试图(在2016年)* 替换 *。两者都是有效的,尽管它们的工作方式有点不同。
updateX方法在其第二个参数中需要一个类似Alex的文档:
{ $set: {"Type" : "DVD"... }
,其中我猜$set
是错误消息中提到的 * 原子操作符 * 的示例。通过更新,您可以针对DB文档的各个属性,而其他属性保持不变。
在这种情况下,第二个参数只是新文档,完整的。没有
$set
或其他(有几个,删除,增量,.)。在所有情况下,第一个参数都是一个MongoDB搜索文档,在我的例子中,我使用
_id
并像这样准备它:let searchDoc = { _id: ObjectID( _id )};
个正如@nagender pratap chauhan提到的,你不能使用
_id
的字符串值进行匹配。此外,与
ObjectID
和ObjectId
(大写或小写“D”)也有一些冲突。第三个参数是可选的,包含选项。
对于
updateOne
方法,声明{ upsert: true}
这意味着,如果没有文档满足第一个参数中规定的搜索条件,Mongo应该创建它。
我的代码是这样的:
字符串
_id
字段不能出现在替换文档中,否则Mongo会抱怨试图改变一个不可变的字段,即使该字段的值与现有字段的值相同。vuv7lop35#
如果要全部更新,请在$ set前使用空大括号示例:- db.student_info.updateMany({},{$set:{“fine”:0,“maxbook”:3}},{upsert:true})
我遇到了同样的错误,因为我使用了这个:- db.student_info.updateMany({$set:{“fine”:0,“maxbook”:3}},{upsert:true})