MongoDB 원자 "findOrCreate" : findOne, 존재하지 않는 경우 삽입하지만 업데이트하지 않습니다.
제목에 나타나 있듯이 _id로 문서에 대해 find (1개)를 수행합니다.존재하지 않으면 문서가 생성되었는지, 발견된 것인지 작성된 것인지 관계없이 해당 문서가 콜백으로 반환되었는지 확인합니다.
findAndModify를 읽었듯이 업데이트가 존재한다면 업데이트하고 싶지 않습니다.Stackoverflow에서 이와 관련된 다른 질문들을 많이 보았지만, 다시 한 번 말씀드리지만, 아무것도 업데이트하고 싶지 않습니다.
(존재하지 않는) 것을 작성함으로써, 그것이 실제로 모두가 이야기하고 있는 업데이트인지 아닌지는 잘 모르겠습니다.모든 것이 너무 혼란스럽습니다.
MongoDB 2.4부터는 원자력에 대해 고유 인덱스(또는 기타 회피책)에 의존할 필요가 없어졌습니다.findOrCreate작전 같은 거
이는 문서를 삽입할 때만 수행되어야 하는 업데이트를 지정할 수 있는 2.4를 처음 사용하는 오퍼레이터 덕분입니다.
이것과 를 조합하여upsertoption(옵션)을 사용할 수 있습니다.findAndModify원자를 달성하다findOrCreate-동작과같은 조작.
db.collection.findAndModify({
query: { _id: "some potentially existing id" },
update: {
$setOnInsert: { foo: "bar" }
},
new: true, // return new doc if one is upserted
upsert: true // insert the document if it does not exist
})
~하듯이$setOnInsert삽입 중인 문서에만 영향을 미치므로 기존 문서가 발견된 경우 수정되지 않습니다.문서가 존재하지 않는 경우 지정된 _id로 문서가 업 상태가 된 후 삽입만 수행합니다.어느 경우든 문서는 반환됩니다.
드라이버 버전> 2
최신 드라이버(> 버전 2)를 사용하여 findOneAndUpdate를 사용하여findAndModify더 이상 사용되지 않습니다.새로운 메서드는 3개의 인수를 사용합니다.filter,그update오브젝트(새 오브젝트에 삽입해야 하는 기본 속성을 포함합니다) 및options여기서 upsert 조작을 지정해야 합니다.
promise 구문을 사용하면 다음과 같습니다.
const result = await collection.findOneAndUpdate(
{ _id: new ObjectId(id) },
{
$setOnInsert: { foo: "bar" },
},
{
returnOriginal: false,
upsert: true,
}
);
const newOrUpdatedDocument = result.value;
조금 더러운데 그냥 넣으시면 됩니다.
키에 고유한 인덱스가 있는지 확인하십시오(_id를 사용하면 이미 고유합니다).
이 방법으로 요소가 이미 존재하는 경우 탐지할 수 있는 예외가 반환됩니다.
존재하지 않는 경우는, 새로운 문서가 삽입됩니다.
갱신: 이 기술에 대한 자세한 설명은 MongoDB Documentation에서 확인
다음은 제가 한 일입니다(Ruby MongoDB 드라이버).
$db[:tags].update_one({:tag => 'flat'}, {'$set' => {:tag => 'earth' }}, { :upsert => true })}
있으면 업데이트하고 없으면 삽입합니다.
언급URL : https://stackoverflow.com/questions/16358857/mongodb-atomic-findorcreate-findone-insert-if-nonexistent-but-do-not-update
'programing' 카테고리의 다른 글
| jquery에서 appendTo를 사용하는 올바른 방법 (0) | 2023.03.13 |
|---|---|
| ReactJS chrome 확장이 설치되었지만 표시되지 않음 (0) | 2023.03.13 |
| AngularJS 오류.성공은 함수가 아닙니다. (0) | 2023.03.13 |
| 경고: 검증DOMName(...): 하위 항목으로 표시할 수 없습니다. (0) | 2023.03.13 |
| 상대 경로와 함께 require 사용 (0) | 2023.03.13 |