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

vsmadaxz  于 12个月前  发布在  Go
关注(0)|答案(5)|浏览(149)

在我的收藏中,只有一份文件。

> 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。

wswtfjt7

wswtfjt71#

第二个参数语法错误,请检查the docs,应为:

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

字符串

ne5o7dgx

ne5o7dgx2#

我相信这是由于除了update()updateMany()之外还引入了updateOne()方法的副作用而改变的,这是为了防止用户意外地覆盖整个文档。
您可以使用replaceOne()方法,或者不指定multi:trueupdate()方法。

anauzrmj

anauzrmj3#

你应该使用这段代码,因为我也面临着同样的问题,然后我使用了这段代码:

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

字符串
你还应该定义**ObjectID**,否则问题会再次出现。

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

fzwojiic

fzwojiic4#

"replaceX"方法和"updateX"方法。
@Alex Blex的答案是 * 更新 * 类型,而PO试图(在2016年)* 替换 *。两者都是有效的,尽管它们的工作方式有点不同。
updateX方法在其第二个参数中需要一个类似Alex的文档:{ $set: {"Type" : "DVD"... },其中我猜$set是错误消息中提到的 * 原子操作符 * 的示例。
通过更新,您可以针对DB文档的各个属性,而其他属性保持不变。

  • replace* 方法将一个完整的文档作为第二个操作数,旨在完全替换DB中现有的当前文档。

在这种情况下,第二个参数只是新文档,完整的。没有$set或其他(有几个,删除,增量,.)。
在所有情况下,第一个参数都是一个MongoDB搜索文档,在我的例子中,我使用_id并像这样准备它:
let searchDoc = { _id: ObjectID( _id )};
正如@nagender pratap chauhan提到的,你不能使用_id的字符串值进行匹配。
此外,与ObjectIDObjectId(大写或小写“D”)也有一些冲突。
第三个参数是可选的,包含选项。
对于updateOne方法,声明
{ upsert: true}
这意味着,如果没有文档满足第一个参数中规定的搜索条件,Mongo应该创建它。
我的代码是这样的:

let searchDoc = { _id: ObjectID( _id )};
this.data = await DAO.db.collection( 'authors' )
.replaceOne(
    searchDoc,                  // filter
    authorData,                 // replacement doc (a JS object)
    {                           // options
        returnOriginal: false,
        sort: [['_id', -1]],
    }
);

return this.data;               // the stored author

字符串
_id字段不能出现在替换文档中,否则Mongo会抱怨试图改变一个不可变的字段,即使该字段的值与现有字段的值相同。

vuv7lop3

vuv7lop35#

如果要全部更新,请在$ set前使用空大括号示例:- db.student_info.updateMany({},{$set:{“fine”:0,“maxbook”:3}},{upsert:true})
我遇到了同样的错误,因为我使用了这个:- db.student_info.updateMany({$set:{“fine”:0,“maxbook”:3}},{upsert:true})

相关问题