2010-08-12 4 views
6

이 질문은 이전에 물어 보았지만 다른 시나리오입니다. 나는이 같은 컬렉션을 가지고 싶습니다하나의 쿼리로 목록을 업서스하는 방법이 있습니까?

{ 
    "_id" : ObjectId("4c28f62cbf8544c60506f11d"), 
    "pk": 1, 
    "forums": [{ 
     "pk": 1, 
     "thread_count": 10, 
     "post_count": 20, 
    }, { 
     "pk": 2, 
     "thread_count": 5, 
     "post_count": 24, 
    }] 
} 

는 내가하고 싶은 것은 카운터를 증가 시키거나 존재하지 않는 경우 항목을 추가하는 "포럼"항목을 upsert하는 것입니다.

예는 다음과 같이 (내가 말이 희망을) 수행하는 경우 :

db.mycollection.update({ 
    "pk": 3, 
    "forums.pk": 2 
}, { 
    "$inc": {"forums.$.thread_count": 1}, 
    "$inc": {"forums.$.post_count": 1}, 
}, true) 

을하고 있습니다

    :

    { 
        "_id" : ObjectId("4c28f62cbf8544c60506f11d"), 
        "pk": 1, 
        "forums": [{ 
         "pk": 1, 
         "thread_count": 10, 
         "post_count": 20, 
        }, { 
         "pk": 2, 
         "thread_count": 5, 
         "post_count": 24, 
        }] 
    }, 
    { 
        "_id" : ObjectId("4c28f62cbf8544c60506f11e"), 
        "pk": 3, 
        "forums": [{ 
         "pk": 2, 
         "thread_count": 1, 
         "post_count": 1, 
        }] 
    } 
    

    내가 반드시 세 단계에 그것을 만들 수 있습니다

  1. 전체 컬렉션을 새로운 항목으로 올리기
  2. addToSet 포럼 항목 당신이 그것을 할 수있는보다 효율적인 방법을 알고

    db.mycollection.update({pk:3}, {pk:3}, true) 
    db.mycollection.update({pk:3}, {$addToSet: {forums: {pk:2}}}) 
    db.mycollection.update({pk:3, 'forums.pk': 2}, {$inc: {'forums.$.thread_counter': 1, {'forums.$.post_counter': 1}}) 
    

    위치 : 목록 말의 위치 운영자

  • 증가 포럼 항목 카운터에? TIA, 마노

    가 발견 겠지만
  • 답변

    10

    positional operator는 upserts에서 사용될 수 없다 :이 일치 배열 요소를 필요로하기 때문에

    위치 적 연산자는 upsert와 결합 될 수 없다. 업데이트 결과가 삽입되면 "$"는 문자 그대로 필드 이름으로 사용됩니다.

    따라서 단일 쿼리에서 원하는 결과를 얻을 수 없습니다.

    이 있으면 카운터 업데이트에서 문서가 분리됩니다. 자신의 솔루션이 올바른 방향으로 가고 있습니다. 다음 두 쿼리로 요약 할 수 있습니다.

    // optionally create the document, including the array 
    db.mycollection.update({pk:3}, {$addToSet: {forums: {pk:2}}}, true) 
    
    // update the counters in the array item 
    db.mycollection.update({pk:3, 'forums.pk': 2}, {$inc: {'forums.$.thread_counter': 1, 'forums.$.post_counter': 1}}) 
    
    +0

    네, 알아 냈습니다. 어쨌든 고마워. – Germano

    관련 문제