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

コレクション内の配列を並べ替える方法

    productsのアイテムを想定 配列は一意であり、MongoDB 2.4のように、この配列をソートされた順序で維持するためのサーバー側の簡単なサポートはありません。ネストされた配列を指定する場合の最善のオプションは、アプリケーションロジックで配列を適切に並べ替えることです(つまり、挿入/更新時、または取得/表示時)。

    データモデリングに関する考慮事項

    ネストされた配列エントリを大量に操作する必要がある場合は、データモデルをフラット化して、操作しやすくすることを検討する必要があります。 MongoDBの設計目標は、アプリケーションのユースケースに適したデータモデルを用意し、挿入/更新/クエリの容易さの間で許容できるパフォーマンスバランスを実現することです。意味がない場合は、単一のコレクション/クエリですべてをモデル化する必要はありません。データを非正規化(複製)する準備をしておく必要があります。商品<=>カテゴリなどの多対多の関係では、更新頻度の低いエンティティを埋め込み、非正規化するのが一般的です(たとえば、商品にカテゴリを埋め込む)。

    並べ替えられ、上限が設定された配列(一意でないアイテム)を永続化する

    配列をソートされた順序で永続化する場合および アイテムは一意ではありません。MongoDB2.4には、 $push ソートされた配列に変換されますが、これはスライスと組み合わせて使用​​する必要があります(配列制限)。 $pushの場合 ソートされた配列と同一のエントリは重複することになります(したがって、これはおそらくあなたが求めているものではありません)。

    pageを想定したサンプルアップデート あなたの例では、コレクション名は次のとおりです。

    db.page.update(
        // Query
        { "_id": "56rgt46rt54h68rt4h6" },
    
        // Update sorted array
        // NB: referring by array index position 0, as there isn't a named reference
        { $push : {
            "categories.0.products" : { 
    
                // List of new elements to push
                $each : [
                    { "name" : "E", "pos": 3 }
                ],
    
                // Sort by pos (ascending)
                $sort : { "pos" : 1 },
    
                // Maximum number of array elements (required for $sort)
                $slice : -100
            }
        }}
    )
    



    1. マングースの一括更新操作

    2. ClusterControlの使用を開始する方法

    3. Trelloのようなカードやリストを再配置する方法は?

    4. MongoDBでSQLLIKEステートメントを使用する方法