MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment importer uniquement des documents non existants ?

Le comportement par défaut de mongoimport ne doit pas être d'écraser les documents existants :dans le shell JS, j'ai créé un document dans la collection "testimport"

> db.testimport.save({_id:1, x:"a"})
> db.testimport.find()
{ "_id" : 1, "x" : "a" }
> 

Voici le contenu du fichier import.json. Il contient 2 documents, un avec un _id unique et un avec un _id en double.

import.json
{_id:1, x:"b"}
{_id:2, x:"b"}

Dans une nouvelle fenêtre de terminal, mongoimport est exécuté :

$ ./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
$

Même si la sortie de mongoimport indique que deux objets ont été importés, le document avec _id:1 n'a pas été écrasé.

> db.testimport.find()
{ "_id" : 1, "x" : "a" }
{ "_id" : 2, "x" : "b" }
>

Si le drapeau --upsert est utilisé, alors le document avec _id:1 sera mis à jour :

$ ./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
$

Dans le shell JS, nous pouvons voir que le document avec _id:1 a été mis à jour :

> db.testimport.find()
{ "_id" : 1, "x" : "b" }
{ "_id" : 2, "x" : "b" }
>

N'est-ce pas le comportement que vous rencontrez ? Ce qui précède a été testé avec la version 2.1.1-pre, mais je ne pense pas que le code mongoimport ait changé depuis un moment.