Perl MongoDB batch_insert - можно сделать как upsert?

perl, mongodb 2.4.9, perl MongoDB 0.702.1

Когда я выполню $collection->batch_insert(\@array), это работает нормально, но есть ли способ заставить сделать upsert в этом случае?

1 ответ

Я не совсем уверен, почему вы хотите это сделать. Если у вас есть документы, соответствующие критериям соответствия, вы их уничтожите.

Тем не менее, с драйвером v1.0.0 или новее (и mongod версии 2.6 или новее), если вы добавите OID заранее, вы можете сделать что-то вроде этого:

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
Другие вопросы по тегам