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

這一個,time1time2之前。在同等優先級的多個字段上排序

我想根據兩個字段進行排序。

  • 如果time1不存在,則使用time2。
  • 或者只是使用相同的優先級。

無論哪種方式都可以。謝謝

+2

我收集你的意思是,考慮到「降序」,你希望兩個值中的「最大」被考慮進行排序。 MongoDB不能在'.sort()'操作中應用「計算」​​,它需要一個當前字段。無論是應用'.aggregate()'語句來計算還是在每次更新時都使用['$ 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 -descending/35389089#35389089),唯一真正的區別在於,這是「兩個不同的字段」,而不是「數組」。但要解決的原則仍然是一樣的。通常情況下,**總是**最好將您的文檔中的字段存儲爲您想要排序的值。 –

回答

0

三點建議:

  1. 排序客戶方 - 這樣你可以只使用arr.sort([的compareFunction])

  2. 變換的出版物和添加該字段https://www.eventedmind.com/items/meteor-transforming-collection-documents

  3. 將分揀字段添加到數據模型(更新現有數據),以及在未來保存/編輯對象時還可以添加/編輯排序字段。不要在出版物中包含該字段,而是在必要時使用它進行分類。

編輯:我會去與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處理similiar情況。你可以嘗試這樣的事情:

OneCollection.aggregate([ 
    { 
    $addFields: { 
     time: { 
     $cond: { 
      if: { 
      $and: [ 
       { $ifNull: ['$time1', false] }, 
       { $gt: ['$time2', '$time1'] } 
      ] 
      }, 
      then: '$time1', 
      else: '$time2' } } 
    } 
    }, 
    { $sort: { time: -1 } }, 
    { $project: { time: false } } 
]); 

它增加了臨時現場時間如果存在且大於時間2值或時間2值,否則並用它來排序存儲時間1值。然後在排序操作完成後從結果文件中刪除時間字段。