복붙노트

[MONGODB] MongoDB를 원자 "findOrCreate"findOne, 삽입하면 존재하지 않는,하지만하지 않습니다 갱신

MONGODB

MongoDB를 원자 "findOrCreate"findOne, 삽입하면 존재하지 않는,하지만하지 않습니다 갱신

제목이 말하는 것처럼, 나는 _id에 의해, 문서의 발견 (을)를 수행하려면 및 존재하지 않는 경우, 그것이 발견 된 후 여부를 만들거나 만들어진이는 콜백에 돌아왔다.

나는 그것이 존재한다면 나는 findAndModify가하는 읽었습니다, 그것은을 업데이트하지 않습니다. 나는이에 대한 유래에 대한 많은 질문을 보았다 그러나 다시, 업데이트 아무것도 바라지 않습니다.

실제로 업데이트 모든 사람에 대한 이야기 ​​즉, (존재하지 않는의) 작성하여 만약 확실하지 오전, 그것은 모두 confuzzling 그래서 :(

해결법

  1. ==============================

    1.MongoDB를 2.4부터이 작업과 같은 원자 findOrCreate에 대한 고유 인덱스 (또는 다른 해결 방법)에 의존하는 더 이상 필요 없습니다.

    MongoDB를 2.4부터이 작업과 같은 원자 findOrCreate에 대한 고유 인덱스 (또는 다른 해결 방법)에 의존하는 더 이상 필요 없습니다.

    이것은 당신이 문서를 삽입 할 경우에만 발생한다 업데이트를 지정할 수 있습니다 2.4 새로운는 $ setOnInsert 연산자 덕분이다.

    이것은 upsert 옵션과 함께, 당신은 원자 findOrCreate 같은 작업을 달성하기 위해 findAndModify를 사용할 수 있다는 것을 의미합니다.

    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 하나를 upsert 다음 삽입 세트 만 수행합니다. 두 경우 모두, 문서가 반환됩니다.

  2. ==============================

    2.findAndModify가 사용되지 않습니다으로 최신 드라이버 (> 버전 2)를 사용하면 findOneAndUpdate를 사용합니다. 새로운 방법은 3 개 인자, 필터 소요 업데이트 (새로운 오브젝트에 삽입 할 기본 속성을 포함) 객체, 그리고 당신이 upsert 작업을 지정해야합니다 옵션.

    findAndModify가 사용되지 않습니다으로 최신 드라이버 (> 버전 2)를 사용하면 findOneAndUpdate를 사용합니다. 새로운 방법은 3 개 인자, 필터 소요 업데이트 (새로운 오브젝트에 삽입 할 기본 속성을 포함) 객체, 그리고 당신이 upsert 작업을 지정해야합니다 옵션.

    약속 구문을 사용하면, 다음과 같다 :

    const result = await collection.findOneAndUpdate(
      { _id: new ObjectId(id) },
      {
        $setOnInsert: { foo: "bar" },
      },
      {
        returnOriginal: false,
        upsert: true,
      }
    );
    
    const newOrUpdatedDocument = result.value;
    
  3. ==============================

    3.그것의 비트 더러운,하지만 당신은 그냥 삽입 할 수 있습니다.

    그것의 비트 더러운,하지만 당신은 그냥 삽입 할 수 있습니다.

    확인 키는 고유 인덱스를 (당신이 _id에게 그것의 확인을 사용하는 경우, 이미 독특한) 가지고해야합니다.

    요소가 이미 존재하는 경우이 방법으로 당신이 잡을 수있는 예외를 반환합니다.

    가 존재하지 않을 경우, 새 문서가 삽입됩니다.

    업데이트 다음 MongoDB를 문서에이 기술에 대한 자세한 설명

  4. ==============================

    4.여기에 내가 (루비 MongoDB를 드라이버) 무슨 짓을했는지 :

    여기에 내가 (루비 MongoDB를 드라이버) 무슨 짓을했는지 :

    $ DB [: 태그] .update_one ({태그 => '플랫'}, { "$ 세트 '=> {태그 =>'지구}}, {upsert ="TRUE})}

    그것은 존재하는 경우를 업데이트하고, 그렇지 않은 경우를 삽입합니다.

  5. from https://stackoverflow.com/questions/16358857/mongodb-atomic-findorcreate-findone-insert-if-nonexistent-but-do-not-update by cc-by-sa and MIT license