2016-07-21 11 views

Antwort

0

Ich weiß nicht genau, warum Sie das tun wollen. Wenn vorhandene Dokumente zu Ihren Abgleichkriterien vorhanden sind, werden sie zerstört.

Dennoch mit dem v1.0.0 oder höher Treiber (und eine Version 2.6 oder höher mongod), wenn Sie OIDs vor der Zeit hinzufügen, können Sie etwas tun:

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"; 

Wenn ich laufe, dass Ich bekomme:

Inserted 5 docs 
Matched 5 docs 
Upserted 5 docs 
+0

Ich weiß, Sie sind auf einem älteren Server und Treiberversion. Hoffentlich gibt Ihnen das einen Anreiz zum Upgrade. Die v1.0.0 + Treiber funktionieren gegen mongod 2.4.9 und der obige Code sollte eigentlich funktionieren, nur nicht sehr effizient, da es individuelle Update-Operationen (10 Round-Trips) durchführt, anstatt es in einen einzigen Umlauf zu stapeln es wäre für mongod 2.6+. – xdg

Verwandte Themen