programing

오류: 업데이트 실행 시 업데이트 작업 문서에 원자 연산자가 포함되어야 합니다.하나.

fastcode 2023. 3. 16. 21:54
반응형

오류: 업데이트 실행 시 업데이트 작업 문서에 원자 연산자가 포함되어야 합니다.하나.

제가 소장하고 있는 서류는 하나뿐입니다.

> 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

위 명령어의 두 번째와 세 번째 인수는 The Definitive Guide to MongoDB: A complete guide to attacking big data ...의 예에서 나온 것입니다. By Eelco Plugge, David Hows, Peter Membrey, Tim Hawkins

나의 MongoDB는 3.2입니다.

두 번째 매개 변수의 구문이 잘못되었습니다.서류를 확인해 주세요.다음 중 하나여야 합니다.

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

저는 이것이 그 도입의 부작용으로 바뀌었다고 생각합니다.updateOne()에 가세하여의update()그리고.updateMany()사용자가 실수로 전체 문서를 덮어쓰는 것을 방지하기 위한 일종의 보호 수단입니다.

대신 메서드를 사용할 수도 있습니다.update()명기하지 않고multi:true.

저도 같은 문제에 직면해 있었기 때문에 다음 코드를 사용해야 합니다.

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

그렇지 않으면 문제가 다시 발생한다는 것도 정의해야 합니다.

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

이 있습니다."replaceX"메서드 및"updateX"방법들.

@Alex Blex의 답변은 업데이트 종류이며, PO는 (2016년에) 교체를 시도하고 있습니다.둘 다 유효합니다.다만, 조금 다르게 동작합니다.

updateX 메서드는 두 번째 인수로 Alex와 같은 문서가 필요합니다.{ $set: {"Type" : "DVD"... }내가 추측하는 바로는$set는 오류 메시지에서 언급된 원자 연산자의 인스턴스입니다.
업데이트를 통해 DB 문서의 개별 등록 정보를 대상으로 지정할 수 있으며, 다른 등록 정보는 변경되지 않습니다.

치환 방법에서는 완전한 문서가 두 번째 오퍼랜드로 사용되며, 이는 DB에 존재하는 현재 문서를 완전히 치환하기 위한 것입니다.
이 경우 두 번째 인수는 완전히 새로운 문서입니다.아니요.$set또는 기타(삭제할 것, 증분할 것 등 여러 가지가 있습니다.)

모든 경우에 첫 번째 인수는 MongoDB 검색 문서입니다.저의 경우,_id이렇게 준비합니다.
let searchDoc = { _id: ObjectID( _id )};
@nagender pratap chauhan이 언급했듯이_id일치하는 문자열 값.
또한, 와 약간의 혼란이 있다.ObjectID그리고.ObjectId(대문자 또는 소문자 "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는 값이 기존 필드와 동일하더라도 불변의 필드를 변경하려고 한다고 불평합니다.

언급URL : https://stackoverflow.com/questions/38883285/error-the-update-operation-document-must-contain-atomic-operators-when-running

반응형