15

mongoimportを使用してCSVファイルからMongodbのObjectIdをインポートするのに苦労しています。

考えられるすべての組み合わせとエスケープメソッドを試しましたが、CSVからObjectIdを正しくインポートできません。

まず、MongoDBからCSVにエクスポートしたものを正確にインポートしてみました。MongoDB2.2.1を使用しています。

2つのコレクションを作成し、あるドキュメントの_idを別のドキュメントで参照しました。

use yourdb
db.createCollection("student")
db.createCollection("class")
db.student.insert({"name":"Peter"})
db.student.find() returns { "_id" : ObjectId("5143af326d44e1ceb372121d"), "name" : "Peter" }
db.class.insert({"student_id": ObjectId("5143af326d44e1ceb372121d"),"name":"II-4"})

次に、シェルでmongoexportコマンドを使用しました。

mongoexport -h localhost:3002 -d yourdb -c classes --csv -f student_id,name > export.txt

結果のCSVは次のようになります。

student_id,name
ObjectID(5143af326d44e1ceb372121d),"II-4"

次に、次を使用して結果のCSVをインポートしました。

mongoimport -h localhost:3002 -d yourdb -c class --type csv --file export.txt --headerline

クエリクラスコレクションは次を返すようになりました。

db.class.find()
{ "_id" : ObjectId("5143afc66d44e1ceb372121e"), "student_id" :   ObjectId("5143af326d44e1ceb372121d"), "name" : "II-4" }
{ "_id" : ObjectId("5143b44788df173ba096550e"), "student_id" : "ObjectID(5143af326d44e1ceb372121d)", "name" : "II-4" }

お気づきのように、2番目のドキュメントのstudent_idフィールドは実際には文字列であり、MongoDBObjectIdではありません。

何かが間違っているか、Mongoが独自にエクスポートしたCSVをインポートできませんか?

4

2 に答える 2

61

JSONからObjectIdsを挿入しようとしているこの問題を抱えている人にとっては、既存のデータに少し変更を加えるだけで非常に可能です。

交換:

{ "_id" : ObjectId("5143afc66d44e1ceb372121e"),
  "student_id" : ObjectId("5143af326d44e1ceb372121d"),
  "name" : "II-4" }

と:

{ "_id" : {"$oid":"5143afc66d44e1ceb372121e"},
  "student_id" : {"$oid":"5143af326d44e1ceb372121d"},
  "name" : "II-4" }

ObjectIdラップを置き換えるには、正規表現を使用するだけです。

于 2015-11-03T19:57:03.497 に答える
4

この問題は、MongoDB2.4.1で再現できます。

ドキュメント(http://docs.mongodb.org/manual/reference/mongoimport/)には次のように記載されています(私が強調):

注mongoimportおよびmongoexportは、データ型情報を確実にキャプチャしないため、フルインスタンスの本番バックアップには使用しないでください。この種の機能については、「MongoDBシステムのバックアップ戦略」で説明されているようにmongodumpとmongorestoreを使用してください。

このディスカッションhttps://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/RcnumM5QyxMでは、同様の質問に次のように回答しました。

tsvまたはcsvを使用したMongoimportは、文字列と数値のみをインポートでき、[1]で指定されている他のタイプはインポートできません。これらのタイプをインポートしたい場合、およびインポートファイルにTSVの代わりにJSONを生成できる場合は、それが良い方法です。それ以外の場合は、文字列を適切なMongoDBタイプに変換する後処理ステップを記述できます(特定のフィールドの値のタイプに関する知識に基づいて)。

  • ダン

[1] http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON

于 2013-04-02T12:17:15.290 に答える