2016-02-19 3 views
3
OneCollection.find({}, {sort: {time1: -1, time2: -1}}); 

Этот, time1 до time2.Сортировка по нескольким полям с равным приоритетом

Я хочу отсортировать по двум полям вместе.

  • Если time1 не существует, используя время2.
  • Или просто используйте равный приоритет.

В любом случае. спасибо

+2

Полагаю, вы подразумеваете, что, учитывая «порядок принятия решений», вы хотите, чтобы «самый большой» из двух значений учитывался для сортировки. MongoDB не может применять «расчет» в операции '.sort()', ему нужно настоящее поле. Либо примените элемент '.aggregate()', чтобы вычислить или использовать оператор обновления '' max max '' (https://docs.mongodb.org/manual/reference/operator/update/max/) при каждом обновлении до надобности сохраните в своем документе поле «maxTime», которое затем можно сортировать. –

+0

@BlakesSeven спасибо, я немного изменил вопрос, есть ли способ для другого? –

+0

Это действительно то же самое. На самом деле это принципиально не отличается от этого вопроса, [«Сортировка по максимальному полю массива восходящего или нисходящего»] (http://stackoverflow.com/questions/35374433/sorting-by-maximum-array-field-ascending-or -здесь/35389089 # 35389089), с единственной реальной разницей в том, что это «два разных поля», а не «массив». Но принципы решения остаются прежними. Вы обычно ** всегда ** лучше сохраняете поле в своем документе со значением, которое хотите сортировать. –

ответ

0

3 предложения:

  1. Сортировка клиентской - таким образом, вы можете просто использовать arr.sort ([compareFunction])

  2. Transform публикации и добавить поле https://www.eventedmind.com/items/meteor-transforming-collection-documents

  3. Добавить сортировку в модель данных (обновить существующие данные) и при сохранении/редактировании объектов в будущем также добавьте/отредактируйте поле сортировки. Не включайте поле в публикации, но используйте его для сортировки, когда это необходимо.

EDIT: Я бы с 3 - таким образом публикации будут более эффективными

0

На стороне сервера вы можете попробовать meteorhacks aggregate package и выполнить сравнение в методе публикации (возможно, вы захотите кэшировать результат). Обратите внимание, что это непроверенные:

if (Meteor.server) { 
    Meteor.publish("OneCollection", function() { 
    if (!this.userId) { // kick them out if they're not logged in 
     this.stop(); 
     return; 
    } 
    var pipeline = [ 
     $project: { 
     time: { $max: [ "time1", "time2" ] } 
     } 
    ]; 
    return OneCollection.aggregate(pipeline); 
    } 
} 
0

мне удалось справиться с ситуацией, используя похожую 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 значения в противном случае и использует его для сортировки. Затем он удаляет время Поле из документа результата после операции сортировки завершено.

Смежные вопросы