0
perlの、MongoDBの2.4.9、perlのMongoDBの0.702.1perl MongoDB batch_insert - upsertとして実行できますか?
私は $collection->batch_insert(\@array)
、 を実行すると、それが正常に動作しますが、この場合にはアップサートを行うために作成する方法はありますか?
perlの、MongoDBの2.4.9、perlのMongoDBの0.702.1perl MongoDB batch_insert - upsertとして実行できますか?
私は $collection->batch_insert(\@array)
、 を実行すると、それが正常に動作しますが、この場合にはアップサートを行うために作成する方法はありますか?
なぜあなたはそれをしたいのか正確にはわかりません。一致基準に既存の文書がある場合、それらを破壊的に上書きします。あなたが先に時間のOIDを追加した場合、あなたはこのような何かを行うことができv1.0.0デベロッパー以降のドライバ(バージョン2.6以降のmongod)とはいえ
、:
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";
私がいることを実行します、私は得る:
Inserted 5 docs
Matched 5 docs
Upserted 5 docs
私はあなたが古いサーバーとドライバのバージョンになっていることを知っている。うまくいけば、これはあなたにアップグレードするためのインセンティブを与えるでしょう。 v1.0.0 +ドライバはmongod 2.4.9に対して動作し、上記のコードは実際には効率的ではありません。個別の更新操作(10回の往復)を1回の往復にバッチするのではなく、それはmongod 2.6+であろう。 – xdg