2012-07-25 2 views
4

나는 같은

var mywords = ["cat", "dog", "fish"] 

을 문자열 배열을하고 '단어'수집이라는 MongoDB를 수집 (로를 upsert하는 절차를 쓰고 있어요). 각 단어가 컬렉션에 몇 번 삽입되었는지 계산하고 싶습니다. 일부 단어는 이미 모음집에 있고 일부는 그렇지 않은 것일 수 있습니다.

이 작동 :

var my_func = function(mywords) { 
    //Get connection to db... 

    mywords.forEach(function(word) { 
     collection.update({name: word}, {$inc: {count: 1}}, {upsert: true}); 
    }); 
} 

신난다. 이제 {name : dog, count : 3}이 컬렉션의 유일한 문서이고 my_func ([ "cat", "dog", "fish"])를 실행하면 컬렉션에 이제 다음이 포함됩니다.

이것은 정확히 내가 한 가지 업데이트로이 모든 작업을 수행하려는 경우를 제외하고는 원하는 것입니다. forEach 내에서가 아니라. 난 단지가 들어있는 같은 모음으로 시작하는 경우, 그러나

var broken_func = function(mywords) { 
    //Get connection to db... 

    collection.update({name: {$in : {mywords}}, {$inc: {count: 1}}, {upsert: true, multi:true}); 
} 

{이름 : 개, 수 : 3} 실행 my_func ([ "고양이", "개", "물고기"])이 시도 , 내 컬렉션은 다음과 같습니다

{name: dog, count: 3} 
{count: 1} 

나는 MongoDB를가 mywords 배열의 문자열이있는 문서의 이름 필드를 일치 해당 문서의 카운트 필드를 증가합니다. mywords에 일부 문자열과 동일한 문서 이름 필드가 없으면 {name : "stringFrom_mywords", count : 1} 문서를 만듭니다.

내가 원하는 것은 가능한 일이며 원하는 행동을 어떻게 달성 할 수 있습니까? forEach를 사용하고 별도의 업데이트를 수행하는 것이 비효율적이라고 생각합니다. 이 정보가 유용하다면 node.js MongoDb 드라이버를 사용하고 있습니다. 내 문제는이 루비 질문과 비슷하다는 것을 알고 있습니다 Upsert Multiple Records with MongoDb

+1

나는 당신이하고있는 것과 매우 비슷한 것을 시도하고 있습니까? $ in 배열의 여러 문서를 업저 레이트 할 수 없다면 어떤 해결책을 찾았습니까? –

답변

1

upsert 및 다중 플래그를 사용하여 업데이트를 실행할 수는 있지만 원하는 효과는 없습니다. 당신은 당신의 forEach 예제로하고있는 것처럼 3 개의 개별 upsert 명령을 실행할 필요가있을 것이다.

이 기능을 MongoDB의 향후 릴리스에 추가하려면 SERVER 프로젝트에서 Jira 티켓을여십시오.