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
}
}}
)