2016-07-21 9 views

답변

0

왜 그렇게하고 싶은지 확실하지 않습니다. 일치 기준에 기존 문서가있는 경우이를 파괴적으로 덮어 씁니다. 나는 것을 실행하면

use v5.10; 
use strict; 
use warnings; 
use MongoDB; 
use MongoDB::OID; 

my $mc = MongoDB->connect; 
my $coll = $mc->ns("test.foo"); 
$coll->drop; 

my @docs = map { { _id => MongoDB::OID->new, x => $_ } } 1 .. 10; 

# insert half as normal 
my $res = $coll->insert_many([ map { $docs[ 2 * $_ + 1 ] } 0 .. 4 ]); 
say "Inserted " . $res->inserted_count . " docs"; 

# upsert whole batch 
$res = $coll->bulk_write([ 
    map { (replace_one => [ { _id => $_->{_id} }, $_, { upsert => 1 } ]) } 
    @docs 
]); 

say "Matched " . $res->matched_count . " docs"; 
say "Upserted " . $res->upserted_count . " docs"; 

: 당신이 미리 OID를 추가하면

그럼에도 불구하고, v1.0.0 개발자 이상 드라이버 (그리고 버전 2.6 이상 mongod)와 함께, 당신은 이런 식으로 뭔가를 할 수 다음과 같이 표시됩니다.

Inserted 5 docs 
Matched 5 docs 
Upserted 5 docs 
+0

이전 서버 및 드라이버 버전을 사용하고 있다는 것을 알고 있습니다. 바라기를, 이것은 당신에게 격상시키는 약간 동기 유발을 줄 것이다. v1.0.0 + 드라이버는 mongod 2.4.9에서 작동하며 위의 코드는 실제로는 효율적이지 않습니다. 단일 왕복으로 일괄 처리하는 대신 개별 업데이트 작업 (10 왕복)을 수행하므로 그것은 mongod 2.6+에 해당합니다. – xdg