2014-10-12 3 views
1

문서 내의 배열을 업데이트하려고하는데 제대로 작동하지만 upsert로 새 요소를 추가하려고 할 때 오류를 실행하는 방법이 실패합니다. 나는 몇 시간 동안 구글에서 검색을 해왔고 mongodb 문서와 내가 시도한 것은 작동 할 수 없다.mongo 및 upsert의 배열 업데이트

컬렉션의 구조는 다음과 같습니다

{ 
"name" : String, 
"providerId": Number, 
"description": String, 
"providers": [ 
    { 
     "merchantId": String, 
     "name": String, 
     "valid": Boolean, 
     "data": String 
    }, 
    { 
     "merchantId": String, 
     "name": String, 
     "valid": Boolean, 
     "data": String 
    }, 
    { 
     "merchantId": String, 
     "name": String, 
     "valid": Boolean, 
     "data": String 
    } 
] 
} 

사용이 쿼리는 기존 데이터를 업데이트 :이 제대로 올바르게 나에게 배열의 요소를 업데이트 워킹

db.collection.update({ "providerId": ID, "providers": { $elemMatch: { "merchantId": MERCHANTID }}}, { $set: { 

    "providers.$.merchantId": MERCHANTID, 
    "providers.$.name": NAME, 
    "providers.$.valid": true, 
    "providers.$.data": DATA 

}}); 

. 요소가 존재하지 않을 때 항목 추가 여부를 알지 못하고 추가 할 수 있지만 가능한 경우 upsert ({upsert : true}) 매개 변수를 추가하려면 검사하지만 다음 오류가 발생합니다. 나는 그것이 어떤 객체 검색도 반환하지 않기 때문이라고 생각한다.

MongoError :

오류 인 위치 연산자는 쿼리에서 필요로 경기를 찾지 못했습니다. 확장되지 않은 업데이트 : 공급자. $. 이름

배열의 하위 문서에서 데이터를 업데이트하는 방법이 있습니까? 존재하지 않는 경우 새 문서를 추가 할 수 있습니까? 연산자 $로 검색하려고했는데 오류가 발생했습니다. 또한 다양한 방법 ({ "providers.merchantId": MERCHANTID}) 및 기타 검색 방법을 조사합니다.

감사

+0

'제공자. $. merchantId'의 $이 (가) 불려지거나 문서화 된 것을 알려주십시오. 몇 가지 이상한 문제가 발생하고 정확히 무엇이 문제인지 파악하려고합니다. – Chris

답변

1

당신이 원하는 것을 달성 할 수있는 옵션이 있습니다.

// step 1 
var writeResult = db.collection.update({ 
    "providerId" : ID, 
    "providers" : { 
     $elemMatch : { 
      "merchantId" : MERCHANTID 
     } 
    } 
}, { 
    $set : { 
     "providers.$.merchantId" : MERCHANTID, 
     "providers.$.name" : NAME, 
     "providers.$.valid" : true, 
     "providers.$.data" : DATA 
    } 
}); 


// step 2 
if (!writeResult.nModified) { // if step 1 has succeeded on update, nModified == 1, else nModified == 0 
    db.collection.update({ 
     "providerId" : ID, 
     "providers.merchantId" : { 
      $ne : MERCHANTID  // this criteria is necessary to avoid concurrent issue 
     } 
    }, { 
     "$push" : { 
      "prividers" : { 
       "merchantId" : MERCHANTID, 
       "name" : NAME, 
       "valid" : true, 
       "data" : DATA 
      } 
     } 
    }); 
} 
+0

좋아요, 비슷한 일을한다고 생각했지만, 삽입을 강요당한 그 어떤 사람도 모르는 것처럼 생각했습니다. Thanks @Wizard – Anto

+0

@Anto, 지정된 ** providerId **가있는 문서를 찾지 못하고 문서 전체를 삽입해야합니까? – Wizard

+0

당신이 말한 것과 비슷한 일을한다고 생각했는데 (업데이트를하고 오류가 발생하면 다시 시도해보십시오), 몽고에 원래 존재했던 것처럼 그것이 있다고 생각했습니다. 나는 초보자이기 때문에 mongoDB의 모든 연산자와 함수를 모른다.) – Anto