2016-08-05 2 views
3

MongoDB 대량 작업을 사용하여 문서를 삽입하고 있습니다.MongoDB 대량 연산자, 삽입하지 않을 경우 삽입

문서를 찾을 수없는 경우에만 삽입하고 싶습니다. 발견 된 경우 (예 : upsert) 업데이트하고 싶지 않습니다.

아이디어가 있습니까?

그러나,이 경우에도 :

var obj = { 
item: 'test' 
} 

bulk.find({ item: {$ne : obj.item}}).upsert().updateOne(obj); 
bulk.execute(); 

이 발견되지 않는 경우는 실제로 아무것도 삽입하지 않는 것 같습니다.

편집 :

나는이 좀 더 명확하게 업데이트하고 싶었다.

대량 API를 사용하여 수행하려고하는 두 가지 작업이 있습니다. 하나는 업데이트하고 하나는 삽입하는 작업입니다.

문서는 다음과 같습니다

{ 
    item: 'test', 
    categories: [{ 
    name: 'one', 
    attr: 'two' 
    }] 
} 

내가 뭘하려는 것은 항목 값이 발견되지 않는 경우, 다음 OBJ를 삽입합니다. 그러나 발견 된 경우 categories.name을 찾지 못하면 $pushcategories 배열의 범주 개체가됩니다. 문서가 있지만 카테고리가 있으면 아무 것도하지 않습니다.

답변

0

당신은이 작업을 수행 할 수 있습니다

db.collection.update(query, update, {upsert: true}) 

예를 official doc에서 :

db.people.update(
    { name: "Andy" }, 
    { 
     name: "Andy", 
     rating: 1, 
     score: 1 
    }, 
    { upsert: true } 
) 
6

뭘 싶어하는 것은 같은 업데이트 작업을 유지하지만, 쿼리를 변경하는 것입니다. documentation에서 : 일치하는 문서가 Bulk.find() 조건 존재하지 않는 경우 true로 설정 upsert의 옵션을

Bulk.find(<query>).upsert().update(<update>); Bulk.find(<query>).upsert().updateOne(<update>); Bulk.find(<query>).upsert().replaceOne(<replacement>);

, 다음 업데이트 또는 교체 작업은 수행 끼워 넣다. 일치하는. 서가 존재하면, 갱신 또는 대체 조작은 지정된 갱신 또는 대체를 수행합니다. 일치하는 문서가 존재하는 경우, 위의에서

var obj = { item: 'test' }; 

bulk.find(obj).upsert().updateOne({ $setOnInsert: obj }); 
bulk.execute(); 

, 업데이트 작업으로 아무것도하지 않습니다하지 않습니다 $setOnInsert와 다음 업데이트 : 조건을 만족 문서를 찾는

변경 쿼리 결과가 삽입되어 쿼리와 일치하는 문서를 찾았습니다.

+0

응답 해 주셔서 감사합니다. 좀 더 명확히하기 위해 질문을 업데이트했습니다. 나는 네가하는 말을하려했지만, 나는 거기에 정확히 도착하지 못하고있다. 도움을 주셔서 감사합니다. – dzm

+0

지구상에'.upsert()'가있는 이유는 무엇입니까? 때로는 어떻게 개발자가 상식을 뛰어 넘을 수 있었는지 궁금합니다. 직관적으로, 그것은 .updateOne ({$ setOnInsert : obj}, {upsert : true})'가 아니 었습니까?개발자의 삶을 끔찍하게 만드는 일탈적인 일이 항상 있다는 점을 제외하면 모든 것이 줄 지어 있습니다. – Rexford

관련 문제