Mongodb 错误:运行updateOne时,更新操作文档必须包含原子运算符
在我的收藏中,只有一个文档Mongodb 错误:运行updateOne时,更新操作文档必须包含原子运算符,mongodb,Mongodb,在我的收藏中,只有一个文档 > db.c20160712.find() { "_id" : ObjectId("57ab909791c3b3a393e9e277"), "Dimension_id" : 2, "Attribute" : "good", "Hour" : "20160712_06", "Frequency_count" : 100 我想运行updateOne以用另一个文档替换该文档。但是为什么会出现错误:更新操作文档必须包含原子运算符 > db.c20160712.
> db.c20160712.find()
{ "_id" : ObjectId("57ab909791c3b3a393e9e277"), "Dimension_id" : 2, "Attribute" : "good", "Hour" : "20160712_06", "Frequency_count" : 100
我想运行updateOne
以用另一个文档替换该文档。但是为什么会出现错误:更新操作文档必须包含原子运算符
> 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是3.2。我相信这是由于引入了
updateOne()
方法的副作用而改变的,除了update()
和updateMany()
作为某种保护措施防止用户意外重写整个文档之外
> db.c20160712.find()
{ "_id" : ObjectId("57ab909791c3b3a393e9e277"), "Dimension_id" : 2, "Attribute" : "good", "Hour" : "20160712_06", "Frequency_count" : 100
您可以使用该方法,或者使用
update()
,而无需为第二个参数指定multi:true
错误的语法。请查收。应该是:
db.c20160712.updateOne(
{ "Attribute" : "good" },
{ $set: {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action" } },
{ upsert: true }
);
您应该使用此代码,因为我也面临同样的问题,然后我使用了此代码:
updateOne(
{ _id: new ObjectID(req.params.id) },
{ $set: { title: req.body.bookName, author: req.body.authorName } },
{ upsert: true }
)
您还应该定义ObjectID,否则问题将再次出现
const ObjectID = require('mongodb').ObjectID;
你犯了和我一样的错误。通过阅读文档,我意识到语法是错误的。尝试:
db.c20160712.updateOne(
{ "Attribute" : "good"},
{"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action"},
{ upsert: true}
)
有“replaceX”
方法和“updateX”
方法
@Alex Blex的回答是更新类的,而采购订单(2016年)试图替换。两者都是有效的,尽管它们的工作方式有点不同
updateX方法在其第二个参数中需要一个类似Alex的文档:{$set:{“Type”:“DVD”…}
,我猜$set
是错误消息中提到的原子运算符的一个实例。使用update,您可以针对DB文档的各个属性,而不改变其他属性 replace方法将完整文档作为第二个操作数,用于完全替换数据库中现有的当前文档。
在本例中,第二个参数只是完整的新文档。没有
$set
或其他参数(要删除的有多个,增量,…)
在所有情况下,第一个参数都是MongoDB搜索文档,在我的情况下,我使用\u id
并像这样准备它:let searchDoc={u-id:ObjectID(\u-id)};
正如@nagender pratap chauhan提到的,您不能使用
\u id
的字符串值进行匹配。此外,还有一些与
ObjectID
和ObjectID
(大写或小写“D”)的混淆
第三个参数(可选)包含选项。对于
updateOne
方法,声明{upsert:true}
这意味着,如果没有满足第一个参数中所述搜索条件的文档,Mongo应该创建它 我的代码是这样的:
let searchDoc={u-id:ObjectID(\u-id)};
this.data=wait DAO.db.collection('authors')
.replaceOne(
searchDoc,//filter
authorData,//替换文档(JS对象)
{//options
returnOriginal:false,
排序:[[''u id',-1]],
}
);
返回this.data;//存储的作者
\u id
字段不能出现在替换文档中,否则Mongo会抱怨试图更改不可变字段,即使其值与现有字段相同。我对“我不只是更新”部分有点困惑。您对更新功能还有什么期望?您是指“替换”文档?那么您应该遵循@dyouberg的建议并使用正确的函数。