Lỗi: tài liệu thao tác cập nhật phải chứa toán tử nguyên tử, khi chạy updateOne


82

Trong bộ sưu tập của tôi, chỉ có một tài liệu.

> db.c20160712.find()
{ "_id" : ObjectId("57ab909791c3b3a393e9e277"), "Dimension_id" : 2, "Attribute" : "good", "Hour" : "20160712_06", "Frequency_count" : 100 

Tôi muốn chạy updateOneđể thay thế tài liệu bằng một tài liệu khác. Nhưng tại sao lại có 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

Đối số thứ hai và thứ ba trong lệnh trên đến từ một ví dụ trong Hướng dẫn dứt khoát cho MongoDB: Hướng dẫn đầy đủ để xử lý Dữ liệu lớn ... Bởi Eelco Plugge, David Hows, Peter Membrey, Tim Hawkins

MongoDB của tôi là 3.2.

Câu trả lời:


118

Cú pháp sai cho tham số thứ hai. Vui lòng kiểm tra tài liệu . Nó phải là:

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

Tôi hơi phân vân với phần "I don't just do update". Bạn mong đợi điều gì khác từ chức năng cập nhật ?
Alex Blex

3
Ý bạn là "thay thế" tài liệu? Sau đó, bạn nên làm theo lời khuyên của @ dyouberg và sử dụng đúng chức năng.
Alex Blex

27

Tôi tin rằng điều này đã được thay đổi như một tác dụng phụ của việc giới thiệu updateOne()phương pháp này ngoài update()updateMany()như một phần nào đó như một biện pháp bảo vệ để ngăn người dùng vô tình ghi đè toàn bộ tài liệu.

Bạn có thể sử dụng replaceOne()phương thức thay thế hoặc một update()mà không cần chỉ định multi:true.


20

Bạn nên sử dụng mã này vì tôi cũng gặp phải vấn đề tương tự và sau đó tôi sử dụng mã này:

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

và bạn cũng nên xác định ObjectIDnếu không sự cố sẽ xảy ra một lần nữa.

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

0

Bạn đã làm sai lầm như tôi đã làm. Sau khi xem qua tài liệu, tôi nhận ra rằng cú pháp sai. Thử:

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

6
Sự khác biệt về cú pháp là gì?
baruchiro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.