7

mongoexport を使用して mongo-db から CSV を取得しようとしています。

私のデータはこの形式です:

{
    "_id": "99",
    "page_id": NumberLong(1122334455),
    "data": {
        "0": {
            "item_id": NumberLong(123456789),
            "item_name": "item1"

        },
        "1": {
            "item_id": NumberLong(987654321),
            "item_name": "item2"
        },
     },
    "last_updated_utc": ISODate("2013-12-19T13:17:43.994Z")

}

これを行うには、次のコマンドを使用しています。

mongoexport -f _id,page_id,last_updated_utc --query {page_id:1122334455} -d mydatabase -c mycollection --csv

これにより、次の出力が得られます。

"99",1122334455,2013-12-19T13:17:43.994Z
exported 1 record

問題は、出力の要素item_nameからが必要なことです。dataこれらは動的配列で、アイテムをまったく含まないか、多数のアイテムを含むことができます。

フィールド (-f) パラメーターに追加dataすると、オブジェクトごとにこれを JSON 文字列として CSV に出力するだけになり、将来のデータの使用には役立ちません。

私が目指しているのは次のようなものです:

"99",1122334455,2013-12-19T13:17:43.994Z,item1
"99",1122334455,2013-12-19T13:17:43.994Z,item2

ほぼ非正規化、または SQL の外部結合に似ています。そのため、dataアイテムIDだけです。

これは可能ですか?item_idを CSV 出力にするにはどうすればよいですか?

4

2 に答える 2

7

モンゴエクスポート

ネストされたオブジェクトのプロパティを取得するには

サンプル文書

{
"_id": "99",
"page_id": NumberLong(1122334455),
"data": {
    "0": {
        "item_id": NumberLong(123456789),
        "item_name": "item1"

    },
    "1": {
        "item_id": NumberLong(987654321),
        "item_name": "item2"
    },
 },
"last_updated_utc": ISODate("2013-12-19T13:17:43.994Z")

MongoExport 構文

mongoexport --host <hostname> --db <Database Name> --collection <collection Name> --csv --fields fieldname1,fieldname2 --out fileName.csv

例:CSV形式でエクスポート

mongoexport --host localhost --db xyz --collection abc --csv --fields data.0.item_id,data.0.item_name,data.1.item_id,data.1.item_name --out important.csv

例 : JSON 形式でエクスポート

mongoexport --host localhost --db xyz --collection abc --fields data.0.item_id,data.0.item_name,data.1.item_id,data.1.item_name --out important.csv

配列の値を取得したい場合は、配列を巻き戻す必要があります。

$unwind : 入力ドキュメントから配列フィールドを分解して、要素ごとにドキュメントを出力します。各出力ドキュメントは、配列フィールドの値が要素に置き換えられた入力ドキュメントです。

詳しくはこちらのリンクをご参照ください

https://docs.mongodb.org/v3.0/reference/operator/aggregation/unwind/

于 2016-01-12T12:50:42.837 に答える
6

Mongoexport は、デフォルトで JSON またはオプションで CSV にデータをエクスポートできるユーティリティです。トップレベルのフィールドではないデータの唯一の有効な表現であるため、JSON としての出力に気付いたように、サブドキュメント情報は次のようになります。したがって、基本的なユースケース向けに設計されています。

それ以外の場合は、独自のソリューションをプログラムして、データを読み取り、CSV 出力に変換する必要があります。

可能であれば、そもそもデータの構造を考え直していただけますかdata。キー付きサブドキュメントの下の構造は意味がありません。配列の場合、Aggregation Framework を使用して少なくとも半分の作業を行うことができます。

{
    "_id": "99",
    "page_id": NumberLong(1122334455),
    "data": [
    {
            "item_id": NumberLong(123456789),
            "item_name": "item1"

        },
        {
            "item_id": NumberLong(987654321),
            "item_name": "item2"
        },
     ],
    "last_updated_utc": ISODate("2013-12-19T13:17:43.994Z")

}

これは、集計を次のように変換できます。

db.sample.aggregate([
    {$unwind: "$data"},
    {$project: { 
       page_id: 1,
       item_name: "$data.item_name",
       last_updated_utc: 1
     }}
])

利回り

[
     {
         "_id" : "99",
         "page_id" : NumberLong(1122334455),
         "last_updated_utc" : ISODate("2013-12-19T13:17:43.994Z"),
         "item_name" : "item1"
     },
     {
         "_id" : "99",
         "page_id" : NumberLong(1122334455),
         "last_updated_utc" : ISODate("2013-12-19T13:17:43.994Z"),
         "item_name" : "item2"
     }
 ],

これは非常に非正規化された形式であり、CSV に変換する可能性が高くなります。

ここでの構造の問題は、各サブドキュメントdataがキーであり、dataそれ自体が配列ではないため、各要素をプログラムでトラバースする必要があることです。これにより、各サブドキュメントに明示的に名前を付ける必要があるため、実行できるクエリ関数のユーティリティも制限されます。

したがって、ツールはなく、データは物事を容易にしてくれません。可能であれば変更してください。

于 2014-02-01T00:30:52.123 に答える