2013-05-01 1 views
2

나는 mongodb에 익숙하지 않으므로 mongodb의 불완전한 문서로 인해 시행 착오로 나를 버려서 스트레스를 받았다. 슬프게도 모든 시도가 오류없이 작동하지 않으므로 혼란 스럽다. 무슨 일이 벌어지고 있었고 무엇을 디버그 할 것인가 ...업 그레트 및 멀티 구문으로 몽고 업데이트

특정 기준에 일치하는 데이터베이스에서 여러 레코드를 업데이트하면 기존 레코드가 아닌 경우 해당 레코드를 새로 작성하면됩니다. 나는 업데이트, upsert 및 멀티와 함께 ​​하나의 데이터베이스 액세스로 그것을 할 수 있다고 생각합니다. 나는 또한 여러 조합 또는 이전 버전과 같은 시도했습니다

dbschema.Person.update({ person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { options: { upsert: true, multi: true } }); 

: ...

dbschema.Person.update({ person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { upsert: true }, { multi: true }); 

그들 중 누구도 작동하지 않습니다를

을하시기 바랍니다 여기에 내가 함께 왔어요 무엇 이게 사소한 것들로 도와주세요 ... 난 쉽게 SQL에서 할 수 있지만, nosql thingy 너무 제한 날 .. 감사합니다!

편집 :

찾기에 동일한 쿼리가 완벽하게 작동합니다 :

dbschema.Person.find({ person_id: { $in: ["734533604" ,"701084015"] } }, function (err, results) { 
    console.log('result: ' + results); 
    console.log('error: ' + err); 
    console.log('result length: ' + results.length); 
}); 

편집 : 내가 만든 될 "을 (를) 찾을 수 없습니다"기록을 기대하고

하고, 발견 기록 될 업데이트되었습니다. 내 논리에 결함이있을 수 있으며 지금은 너무 혼란 스럽습니다.

원래 한 번에 하나의 레코드를 찾고 값을 변경하고 수정 된 각 레코드에 대해 save()를 호출했지만 배포를 위해 배포 한 경우 응답 시간이 수 백 시간 느려졌습니다. 특히 각 요청마다 업데이트 할 레코드가 수백 개있을 때 특히 그렇습니다.

그런 다음 find() + $ in이 발견되어 성능이 복원되고 이전 쿼리 (쿼리)보다 좋지만 업데이트가 여전히 느려집니다. 따라서 모든 문서를 업데이트하는 방법을 찾고 있습니다. 언제 CASE THEN 하나 개의 쿼리에 ..

는 제가 일반적으로 SQL에서 할 것은 예 ... UPDATE를 사용하고 있습니다 :

+0

는 불가능합니다 –

+0

몇 가지 문제가 있지만 구문 적이지만 다른 디자인이 있습니다. 2 개의 일치하는 레코드를 찾고 있는데 아무 것도 발견되지 않으면 두 레코드가 모두 생성되기를 기대합니까? 두 가지 중 하나가 발견되면, 하나는 업데이트되고 하나는 생성되기를 기대합니까? Upsert는 최대 하나의 새 레코드를 만들 수 있으므로 이것이 멀티 및 업셋이 때때로 함께 이해할 수없는 이유입니다. –

+0

예, 찾을 수없는 경우 둘 다 생성 될 것으로 예상됩니다. 하나가 발견되면 업데이트되고 발견되지 않은 것들이 생성됩니다. 당신이 맞습니다. 나는 혼란스럽고 아마도 내 논리는 다음과 같이 결함이 있습니다. 글쎄 ..하지만 내가 왜 이런 식으로하려고하는지 설명 할께. – Zennichimaro

답변

5

당신은 서로 다른 기준에 따라 여러 레코드를 업데이트하고 알아 내기 위해 "upsert"를 기대할 수 없다 너 무슨 뜻이야? Upsert 플래그는 최대 하나의 문서를 삽입 할 수 있으며 문서를 확인하면 업 서트의 경우 업데이트를위한 "복합"기준을 갖는 것이 적절하지 않음을 알 수 있습니다.

귀하의 예에서, 삽입물은 두 개의 fbid 값 중 어느 것을 사용해야합니까?

나는 여러 가지 접근법을 취할 수 있다고 생각한다. 각 fbid 값에 대해 업데이트를 호출하는 루프에서 upsert 플래그를 사용하여 업데이트 할 수 있습니다. 예상 한대로 작동하며 fbid가없는 경우 새 문서가 만들어집니다. 다른 방법으로는 업데이트를 실행하기 전에 쿼리하는 것이 포함되지만 이러한 방법은 경쟁 조건에 더 취약 할 수 있다고 생각합니다.여기

는 업데이트가 작동하는 방법의 설명이다 - 나는 꽤 완전한 찾기 : upsert 한 번에 하나의 personid를 삽입 할 수 있으며이 제 1 및 제 2 값 사이에 혼동하기 때문에 $로 upsert 사용 http://docs.mongodb.org/manual/core/update/#update-operations-with-the-upsert-flag

+1

감사합니다. $ in의 모든 레코드가 업데이트되거나 삽입 될 것으로 예상했습니다. 나는 이것이 나의 응답 시간을 죽이는 많은 삽입/갱신을 최적화하려고 노력할 때 이것이 그것을 할 수있는 방법인지 확신 할 수 없다. 많은 레코드를 삽입/업데이트 할 수 있으며 한 번에 저장하는 것이 좋습니다. – Zennichimaro

+0

귀하의 질문을 이해할 수있는 방법이 없습니다. –

관련 문제