>

다음 질문을 고려하십시오

var collectionName = "test";
db.createCollection(collectionName);
db.getCollection(collectionName).insert({
  "_id" : 1, "char" : "Gandalf", "class" : "barbarian", "lvl" : 20
});
db.getCollection(collectionName).bulkWrite([
    { 
      insertOne: {
        "document": {
            "_id" : 2, "char" : "Dithras", "class" : "barbarian", "lvl" : 4
        }
      }
    },
    { 
      updateOne: { 
        filter: { "_id": 1}, 
        update: { $set: {"class" : "mage"} }, 
        upsert: true 
      } 
    }
])

결과 :

{
    "acknowledged" : true,
    "deletedCount" : 0.0,
    "insertedCount" : 1.0,
    "matchedCount" : 1.0,
    "upsertedCount" : 0.0,
    "insertedIds" : {
        "0" : 2.0
    },
    "upsertedIds" : {}
}

내 질문은 id:1 로 문서를 업데이트하는 이유입니다.   upsertedIds 에 들어 가지 않습니다 ? 이 문서가 upsert로 업데이트되지 않습니까? 아니면 아무것도 빠졌습니까?

문서에 따르면 upsert 에만 정보를 추가합니다  문서를 찾지 못하면 실제로 inserted 와 비슷합니다. )이지만이 경우 어떤 항목이 업데이트되었는지 알 수 없습니다.

쿼리를 실행할 때 어떤 문서를 수정할 수 있습니까?

<시간>

XY 문제를 피하려면 : 대량 작업 항목이 실패하고 싶습니다 (예 : upsert:false 로 존재하지 않는 문서를 업데이트하려고 할 때) ) 및 오류를 발생시킨 ID를 기록합니다.

  • 답변 # 1

    아무것도 강요하지 않았기 때문입니다. 정기적 인 업데이트입니다.

    문서가있는 경우 수정 문서에 수정 사항을 적용하십시오 (업데이트).

    그렇지 않으면 문서를 만든 다음 수정 사항을 적용하십시오 (업 스테이트).

    id = 1의 문서가 있으므로 업데이트입니다.

    시도한 경우 :

    { 
      updateOne: { 
        filter: { "_id": 3}, 
        update: { $set: {"class" : "mage"} }, 
        upsert: true 
      } 
    }
    
    

    존재하지 않은 문서의 경우 id = 3을 참고하십시오.

    업 사트를 받았을 것입니다.

  • 답변 # 2

    일괄 업데이트를 준비 할 때 문서 ID를 수집 한 다음 업데이트 후 존재하지 않는 문서 ID를 확인할 수 있습니다. 예 : upsert:false 로 업데이트 한 문서 ID 1, 2 및 3의 경우

    db.test.aggregate([
        { $group: { _id: null }},    
        { $project: { _id: [ 1, 2, 3 ] }},
        { $unwind: "$_id" },
        { $lookup: {
           from: "test",
           localField: "_id",
           foreignField: "_id",
           as: "exists"
        }},
        { $match: { exists: { $size:0 }}},
        { $project: { exists:0 }}
    ])
    
    

    어떤 문서와도 일치하지 않는 필터 ID를 반환합니다 (예 : 용어에서 "실패").

  • 이전 jms - Java에서 JMSBytesMessage를 TextMessage로 변환하는 방법
  • 다음 java - 스프링 부트 - 역할에 따른 데이터 접근