0

これが可能かどうかはわかりません。以下のようなデータ構造を持つbooksコレクションがあります。

{
    "_id" : ObjectId("6539d19532f73ad544000001"),
    "name" : "PHP",
    "books" : [
        {"author": "jim", "title" : "Book1", "price":"200"},
        {"author": "joe", "title" : "Book2", "price":"300"},
        {"author": "amy", "title" : "Book3", "price":"500"}
    ]
}

ここで、books セクションに新しいオブジェクトを挿入します。オブジェクトはのようなもの{"author": "amy", "title" : "Book4", "price":"400"}です。価格が 500 未満なので、そのオブジェクトを Book3 の前に挿入します。したがって、私の最終的なオブジェクトは、以下のようになります。

{
    "_id" : ObjectId("6539d19532f73ad544000001"),
    "name" : "PHP",
    "books" : [
        {"author": "jim", "title" : "Book1", "price":"200"},
        {"author": "joe", "title" : "Book2", "price":"300"},
                {"author": "amy", "title" : "Book4", "price":"400"}
        {"author": "amy", "title" : "Book3", "price":"500"}
    ]
}
4

1 に答える 1

1

MongoDB では、ネストされた配列要素を特定の場所に挿入することはできません。で最後にのみ追加できます$push。本当に必要なのは、スキーマを再構築することです。ネストされた配列にすべての本を格納する代わりに、PHP各本を個別に格納し、キーワード PHP を追加することができます。

{ "name" : "PHP", "author": "jim", "title" : "Book1", "price": 200 }
{ "name" : "PHP", "author": "joe", "title" : "Book2", "price": 300 }
{ "name" : "PHP", "author": "amy", "title" : "Book3", "price": 500 }
{ "name" : "PHP", "author": "amy", "title" : "Book4", "price": 400 }

_id(そこからフィールドを省略しました)

次に、本を取得するときにいつでも並べ替えを行うことができます。

db.collection.find( { name: "PHP" } ).sort( { price: 1 } );

追加の利点は、(もちろん価格が変更されない限り) ドキュメントを変更する必要がないことです。要素を追加することによってドキュメントが大きくならないようにすると、パフォーマンスが向上します。PHPネストされた book 配列が合計 16MB (MongoDB ドキュメント サイズ制限) に制限されていたため、名前 ( ) ごとのドキュメント数も無制限になりました。

500また、価格は文字列 ( ) ではなく数値 ( ) として保存してください"500"。後で計算する方がはるかに簡単です。

于 2013-08-06T14:48:06.357 に答える