sql >> データベース >  >> NoSQL >> MongoDB

MongoDB:$addToSetまたは$pushを使用する場合、ドキュメントを事前に割り当てる必要がありますか?

    通常はそうではないユースケースで実行可能である場合は、これをお勧めします。時系列データは注目すべき例外です。 $addToSetには実際には適用されません および$push 配列を大きくするとドキュメントのサイズが大きくなる傾向があるためです。

    止まる。何万ものエントリを持つ絶えず成長するアレイが必要ですか?特定のエントリを取り戻すためにクエリを実行しますか?配列エントリのフィールドにインデックスを付けますか?おそらく、ドキュメントの構造を再考する必要があります。たぶんあなたはそれぞれのdataが欲しいでしょう marketのようなフィールドを持つ別のドキュメントになるエントリ 、typecreatedAt それぞれに複製されますか?ドキュメントの移動について心配する必要はありません。

    アレイが75Kエントリに成長するのはなぜですか?ドキュメントあたりのエントリ数を減らすことはできますか?これは時系列データ ?ドキュメントを事前に割り当て、mmapストレージエンジンを使用してインプレース更新を実行できるのは素晴らしいことですが、すべてのユースケースで実行できるわけではなく、MongoDBが適切に機能するための要件ではありません。

    いいえ、これはあまり役に立ちません。ドキュメントサイズは、配列内のnull値のBSONサイズに基づいて計算されるため、nullを置き換えると 別のタイプではサイズが大きくなり、とにかくドキュメントが書き換えられます。すべてのフィールドがそのタイプのデフォルト値に設定されているオブジェクトを使用して配列を事前に割り当てる必要があります。例:

    {
        "date" : ISODate("1970-01-01T00:00:00Z")    // use a date type instead of a string date
        "price" : 0,
        "amount" : 0,
        "tid" : "000000", // assuming 7 character code - strings icky for default preallocation
        "type" : "none"    // assuming it's "buy" or "sell", want a default as long as longest real values
    }
    


    1. mongodbシェルでドキュメント値を出力します

    2. Meteorサーバー側でmongoグループを実行する方法

    3. activerecordとmongo/mongo-マッパーブリッジ

    4. 接続の管理