5

mongoimportを使用して、_idの文字列値でデータをアップサートしようとしています。IDは(引用符で囲まれていても)整数のように見えるため、mongoimportはそれらを整数として扱い、既存のレコードをアップサートする代わりに新しいレコードを作成します。

私が実行しているコマンド:

mongoimport --host localhost --db database --collection my_collection --type csv --file mydata.csv --headerline --upsert

mydata.csvのサンプルデータ:

{ "_id" : "0364", someField: "value" }

その結果、mongo{ "_id" : 364, someField: "value" }は_idでレコードを更新する代わりに、次のようなレコードを挿入し"0364"ます。

誰かがそれ_idを文字列として扱うようにする方法を知っていますか?

動作しないもの:

  • データを二重引用符""0364 ""、二重引用符および一重引用符"'0364'"または'"0364"'で囲みます。
  • 空の文字列を値に追加します:{ "_id" : "0364" + "", someField: "value" }
4

5 に答える 5

2

残念ながら、数字のような文字列を文字列として強制的に解釈する方法は現在ありません。

https://jira.mongodb.org/browse/SERVER-3731

次のように、Pythonまたは快適な他の言語でスクリプトを書くことができます。

import csv, pymongo

connection = pymongo.Connection()
collection = connection.mydatabase.mycollection
reader = csv.DictReader(open('myfile.csv'))
for line in reader:
    print '_id', line['_id']
    upsert_fields = {
        '_id': line['_id'],
        'my_other_upsert_field': line['my_other_upsert_field']}

    collection.update(upsert_fields, line, upsert=True, safe=True)
于 2012-04-24T17:52:46.687 に答える
2

この同じ問題に遭遇し、別の問題を発見しました。CSVをJSONに変換し、フィールドを引用符で囲むことにより、Mongoに文字列以外の値に文字列型を使用させることができます。たとえば、CSVが次のようになっている場合:

key value
123 foo
abc bar

次に、キー123の整数フィールドとキーabcの文字列フィールドを取得します。これをJSONに変換し、すべてのキーが引用符で囲まれていることを確認してから、--type jsonインポート時に使用すると、目的の動作になります。

{
    "123":"foo",
    "abc":"bar"
}
于 2013-08-01T17:43:34.540 に答える
1

私は数字列に接頭辞を付けることができました、そしてそれは私のために働きました。例:

00012345は12345(Type Int)としてインポートされましたstring00012345はstring00012345(Type String)としてインポートされました

私のソースはSQLデータベースだったので、

select 'string'+column as name

もちろん、文字列を解析するために少し後処理を行う必要もありますが、かなり大きなtsvファイルをjsonに変換するよりもはるかに少ない労力で済みます。

また、拡張のために上記のjiraリンクに+1を追加しました。

于 2014-05-28T00:11:36.083 に答える
0

@Jesseの代わりに、mongoコンソールで同様のことを行うことができます。

db.my_collection.find().forEach(function (obj) {
  db.my_collection.remove({_id: obj._id); // remove the old one
  obj._id = '' + obj._id; // change to string
  db.my_collection.save(obj); // resave
});

_idフィールドの場合は、次のようにするだけです。

db.my_collection.find().forEach(function (obj) {
  obj.someField = '' + obj.someField; // change to string
  db.my_collection.save(obj); // resave
});
于 2016-08-31T15:31:18.930 に答える
0

同じ問題が発生しました。

最も簡単な方法は、オンラインツールを使用してCSVファイルをJSONファイルに変換してからインポートすることだと思います。

これは私が使用したツールです:

http://www.convertcsv.com/csv-to-json.htm

これにより、CSVファイルの整数値をJSONファイルの二重引用符で囲むことができます。

このJSONファイルのインポートで問題が発生し、エラーが発生した場合は、インポートコマンドに--jsonArrayを追加するだけです。それは確かに機能します。

mongoimport --host localhost --db mydb -c mycollection --type json --jsonArray --file <file_path>
于 2016-10-16T13:49:30.587 に答える