错误:运行updateOne时,更新操作文档必须包含原子运算符


82

在我的收藏中,只有一个文档。

> 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,David Hows,Peter Membrey,Tim Hawkins

我的MongoDB是3.2。

Answers:


118

第二个参数的语法错误。请检查文档。它应该是:

db.c20160712.updateOne(
    { "Attribute" : "good" }, 
    { $set: {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action" } },
    { upsert: true }
);

我对“我不只是进行更新”部分感到困惑。您还对更新功能有什么期望?
亚历克斯·布莱克斯

3
您的意思是“替换”文档?然后,您应该遵循@dyouberg的建议并使用正确的功能。
亚历克斯·布莱克斯

27

我相信,这是引入该updateOne()方法的副作用,update()并且updateMany()是防止用户意外覆盖整个文档的一种安全措施。

您可以改用replaceOne()方法,也可以update()不指定而使用multi:true


20

您应该使用此代码,因为我也遇到了相同的问题,然后使用了以下代码:

updateOne(
    { _id: new ObjectID(req.params.id) },
    { $set: { title: req.body.bookName, author: req.body.authorName } },
    { upsert: true }
)

并且您还应该定义ObjectID否则问题将再次发生。

const ObjectID = require('mongodb').ObjectID;

0

您犯了与我相同的错误。通过文档后,我意识到语法是错误的。尝试:

db.c20160712.updateOne( 
   { "Attribute" : "good"}, 
   {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action"}, 
   { upsert: true} 
)

6
语法上有什么区别?
baruchiro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.