0

次のスキーマを持つ複数のドキュメントがあると仮定します。

{
        "_id" : ObjectId("55ec6108794ac3cc530041ac"),
        "product": "Product x",
        "desc": "Blah Blah Blah",
        "prices" : [
                {
                    "price": 12.3,
                    "is_price_active": false,
                },
                {
                    "price": 15.3,
                    "is_price_active": false,
                },
                {
                    "price": 15,
                    "is_price_active": true,
                }
        ]
}

アクティブな価格に従って結果セットを注文することは可能ですか、それとも最後の価格に基づいて結果を注文することは可能ですか (私の場合、アクティブな価格は常に最後の価格であるため)。

このようなもの:orderBy('prices.[prices.length - 1].price', 'desc')

前もって感謝します...

4

1 に答える 1

0

あなたはできる :

  • くつろぐprices
  • 並べis_price_active替えprice
  • 製品ごとに再グループ化 (逆巻き戻し)
  • 最終的に投影してドキュメントの元の形状を取得します

この方法では、アクティブな価格が常に最後の価格であるという事実に依存しません。アクティブな価格は、配列内のどこでもかまいません。

ここでリクエスト:

db.products.aggregate([
    {$unwind : "$prices"},
    {$sort : { "prices.is_price_active":-1, "prices.price" : 1 }},
    {$group : { "_id" : {"_id" : "$_id", "product" : "$product", "desc" : "$desc"}, "prices" : {$push : "$prices"} }},
    {$project : {"_id" : "$_id._id", "product" : "$_id.product", "desc" : "$_id.desc", "prices" : 1}}
]);
于 2015-09-07T11:15:34.310 に答える