MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como importar apenas documentos não existentes?


O comportamento padrão do mongoimport não deve ser sobrescrever documentos existentes:No shell JS, criei um documento na coleção "testimport"
> db.testimport.save({_id:1, x:"a"})
> db.testimport.find()
{ "_id" : 1, "x" : "a" }
> 

Aqui está o conteúdo do arquivo import.json. Ele contém 2 documentos, um com um _id exclusivo e outro com um _id duplicado.
import.json
{_id:1, x:"b"}
{_id:2, x:"b"}

Em uma nova janela de terminal, mongoimport é executado:
$ ./mongoimport -d test -c testimport import.json -vvvvv 
Wed Apr  4 19:03:48 creating new connection to:127.0.0.1
Wed Apr  4 19:03:48 BackgroundJob starting: ConnectBG
Wed Apr  4 19:03:48 connected connection!
connected to: 127.0.0.1
Wed Apr  4 19:03:48 ns: test.testimport
Wed Apr  4 19:03:48 filesize: 29
Wed Apr  4 19:03:48 got line:{_id:1, x:"b"}
Wed Apr  4 19:03:48 got line:{_id:2, x:"b"}
imported 2 objects
$

Mesmo que a saída de mongoimport diga que dois objetos foram importados, o documento com _id:1 não foi substituído.
> db.testimport.find()
{ "_id" : 1, "x" : "a" }
{ "_id" : 2, "x" : "b" }
>

Se o sinalizador --upsert for usado, o documento com _id:1 será atualizado:
$ ./mongoimport -d test -c testimport import.json -vvvvv --upsert
Wed Apr  4 19:14:26 creating new connection to:127.0.0.1
Wed Apr  4 19:14:26 BackgroundJob starting: ConnectBG
Wed Apr  4 19:14:26 connected connection!
connected to: 127.0.0.1
Wed Apr  4 19:14:26 ns: test.testimport
Wed Apr  4 19:14:26 filesize: 29
Wed Apr  4 19:14:26 got line:{_id:1, x:"b"}
Wed Apr  4 19:14:26 got line:{_id:2, x:"b"}
imported 2 objects
$

No shell JS, podemos ver que o documento com _id:1 foi atualizado:
> db.testimport.find()
{ "_id" : 1, "x" : "b" }
{ "_id" : 2, "x" : "b" }
>

Não é este o comportamento que você está experimentando? O acima foi testado com a versão 2.1.1-pre, mas não acredito que o código do mongoimport tenha mudado por um tempo.