Mongodb Предел агрегации в процентах от количества результатов - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть коллекция заказов:

Orders:
{
  //some typical order fields
  cancelationMoment: {
    type: Date
  },
  
  consumer: {
    type: Schema.Types.ObjectId,
    required: 'consumer id required'
  }
  
}

Я хочу получить потребителей, у которых больше отмененных заказов (топ 10%).

Моя текущая реализация:

db.orders.aggregate([
	{$match:{ cancelationMoment: { $exists: true } }},
        {"$group" : {_id:"$consumer", ordersCanceled:{$sum:1}}
        },
        
        {$sort:{"ordersCanceled":-1}},
       
        { $limit:  2}
        
        ]);

Но я хочу получить не только топ-2, но и топ-10%.Возможно ли это?

Спасибо.

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете сохранить переменную с диапазоном коллекции и затем манипулировать, как вам нужно.

var total = db.orders.find({ }).count();

db.orders.aggregate([  
    { 
        $limit: total * 0.1
    }
]);

Обновление:

Хорошо, используя этап "$count "повлияет на проекцию результата, но вы можете напрямую использовать предыдущий код на этапах агрегации.

db.orders.aggregate([  
    { 
        $limit: db.orders.find({ }).count() * 0.1
    }
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...