мне удалось справиться с ситуацией, используя похожую aggregation. Вы можете попробовать что-то вроде этого:
OneCollection.aggregate([
{
$addFields: {
time: {
$cond: {
if: {
$and: [
{ $ifNull: ['$time1', false] },
{ $gt: ['$time2', '$time1'] }
]
},
then: '$time1',
else: '$time2' } }
}
},
{ $sort: { time: -1 } },
{ $project: { time: false } }
]);
Это добавляет временно поле времени, который хранит TIME1 значения, если оно существует, и больше, чем time2 значение или time2 значения в противном случае и использует его для сортировки. Затем он удаляет время Поле из документа результата после операции сортировки завершено.
Полагаю, вы подразумеваете, что, учитывая «порядок принятия решений», вы хотите, чтобы «самый большой» из двух значений учитывался для сортировки. MongoDB не может применять «расчет» в операции '.sort()', ему нужно настоящее поле. Либо примените элемент '.aggregate()', чтобы вычислить или использовать оператор обновления '' max max '' (https://docs.mongodb.org/manual/reference/operator/update/max/) при каждом обновлении до надобности сохраните в своем документе поле «maxTime», которое затем можно сортировать. –
@BlakesSeven спасибо, я немного изменил вопрос, есть ли способ для другого? –
Это действительно то же самое. На самом деле это принципиально не отличается от этого вопроса, [«Сортировка по максимальному полю массива восходящего или нисходящего»] (http://stackoverflow.com/questions/35374433/sorting-by-maximum-array-field-ascending-or -здесь/35389089 # 35389089), с единственной реальной разницей в том, что это «два разных поля», а не «массив». Но принципы решения остаются прежними. Вы обычно ** всегда ** лучше сохраняете поле в своем документе со значением, которое хотите сортировать. –