Perl, MongoDB 2.4.9, Perl MongoDB 0.702.1perl MongoDB batch_insert - может быть сделано как upsert?
Когда я исполняю $collection->batch_insert(\@array)
, он отлично работает, но есть ли способ, чтобы сделать, чтобы сделать upsert в этом случае?
Perl, MongoDB 2.4.9, Perl MongoDB 0.702.1perl MongoDB batch_insert - может быть сделано как upsert?
Когда я исполняю $collection->batch_insert(\@array)
, он отлично работает, но есть ли способ, чтобы сделать, чтобы сделать upsert в этом случае?
Я точно не знаю, почему вы хотите это сделать. Если у вас есть существующие документы по вашим критериям соответствия, вы разрушите их.
Тем не менее, с v1.0.0 или более поздней версии драйвера (и версии 2.6 или более поздней версии mongod), если добавить OIDs раньше времени, вы можете сделать что-то вроде этого:
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 раундов) вместо того, чтобы доставлять его в один раунд это было бы для mongod 2.6+. – xdg