Ако приемем, че имаме множество документи със следната схема:
{
"_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")
Благодаря предварително...
Отговори:
0 за отговор № 1Можеш :
- развивам
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}}
]);