Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 错误:运行updateOne时,更新操作文档必须包含原子运算符_Mongodb - Fatal编程技术网

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的建议并使用正确的函数。