4

多数のjsonをインポートするためにmongo importを使用していますが、存在しないレコードのみをインポートする方法を探しています(oidで確認できます)。--upsert を試してみましたが、レコードが更新され、既に存在する場合は完全に無視したいと思います。

何か案は...?

4

1 に答える 1

11

mongoimport のデフォルトの動作は、既存のドキュメントを上書きすることではありません。JS シェルで、コレクション「testimport」にドキュメントを作成しました。

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

ファイル import.json の内容は次のとおりです。これには、一意の _id を持つドキュメントと重複する _id を持つドキュメントの 2 つのドキュメントが含まれています。

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

新しいターミナル ウィンドウで、mongoimport が実行されます。

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

mongoimport の出力には 2 つのオブジェクトがインポートされたことが示されていますが、_id:1 のドキュメントは上書きされていません。

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

--upsert フラグを使用すると、_id:1 のドキュメントが更新されます。

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

JS シェルでは、_id:1 のドキュメントが更新されていることがわかります。

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

これはあなたが経験している行動ではありませんか?上記はバージョン 2.1.1-pre でテストされていますが、mongoimport のコードはしばらく変更されていないと思います。

于 2012-04-04T23:24:44.353 に答える