1

MongoDB に保存したい大量の JSON ドキュメントがあります。

ただし、いくつかのフィールドに対してのみ検索および取得していることを考えると、パフォーマンス面でどちらが優れているか疑問に思っていました。

1 つのオプションは、大きなオブジェクトを JSON/BSON として保存することで、ドキュメントは次のようになります。

{
    "key_1": "Value1",
    "key_2": "Value2",
    "external_data": {
        "large": {
            "data": [
                "comes",
                "here"
            ]
        }
    }
}

あるいは、

{
    "key_1": "Value1",
    "key_2": "Value2",
    "external_data": '{"large":{"data":["comes","here"]}}'
}
4

3 に答える 3

2
興味深い質問なので、わざわざ調べてみました。


並べ替えの答えは、書き込みに大きなパフォーマンスの違いはありません。
ここでは、結果に沿って pymongo ドライバーを使用してテストするために使用したコードを示します。

    docdict=dict(zip (["key" + str(i) for i in range (1,101)],[ "a"*i for i in range(1,101)]))
    docstr=str(docdict)
    def addIdtoStr(s,id):return {'_id':id,'payload':s}
    def addIdtoDict(d,id): d.update({'_id':id});return d
    cProfile.run("for i in range(0,100000):x=dbcl.client.tests.test2.insert(addIdtoDict(docdict,i),w=0,j=0)")
     **56.089 秒で 12301152 回の関数呼び出し (12301128 回のプリミティブ呼び出し)**
    dbcl.client.tests.test2.remove({},multi= True)
    cProfile.run("for i in range(0,100000):x=dbcl.client.tests.test2.insert(addIdStr(docstr,i),w=0,j=0)")
     **54.665 秒で 12201194 回の関数呼び出し (12115631 回のプリミティブ呼び出し)**

于 2013-02-13T15:57:48.860 に答える
2

データを BSON に格納することは、パフォーマンスとスペース効率の両方に優れていると思います。そして、それによって将来に「投資」します。現在データを BSON として保存すると、後でそのような要件が発生した場合にデータベースクエリを実行できます。

とにかく、パフォーマンスが懸念される場合は、本番環境でプロファイルする必要があります。「高速になるかどうか」を判断する方法はありません。

于 2013-02-13T14:08:36.617 に答える
0

MongoDB は、JSON ではなく BSON ドキュメント ストアです。MongoDB は JSON を直接クエリできません。

これは、ここでのアイデアの根本的な欠陥です。インデックスなどを使用できるパフォーマンスの高い方法でそのドキュメント内の何かをクエリしたい場合は、BSON ドキュメントの JSON 文字列としてではなく、BSON ドキュメントとして保存する必要があります。

ただし、次を使用する場合:

{
    "key_1": "Value1",
    "key_2": "Value2",
    "external_data": '{"large":{"data":["comes","here"]}}'
}

key_1そして、クエリを実行する必要があるだけでkey_2、JSON はここではスペースを節約するだけでなく、文字列であるため (そのフィールドにインデックスがない限り) 保存も容易であることが実際にわかります。

于 2013-02-13T15:59:38.703 に答える