OneCollection.find({}, {sort: {time1: -1, time2: -1}});
這一個,time1
在time2
之前。在同等優先級的多個字段上排序
我想根據兩個字段進行排序。
- 如果time1不存在,則使用time2。
- 或者只是使用相同的優先級。
無論哪種方式都可以。謝謝
OneCollection.find({}, {sort: {time1: -1, time2: -1}});
這一個,time1
在time2
之前。在同等優先級的多個字段上排序
我想根據兩個字段進行排序。
無論哪種方式都可以。謝謝
三點建議:
排序客戶方 - 這樣你可以只使用arr.sort([的compareFunction])
變換的出版物和添加該字段https://www.eventedmind.com/items/meteor-transforming-collection-documents
將分揀字段添加到數據模型(更新現有數據),以及在未來保存/編輯對象時還可以添加/編輯排序字段。不要在出版物中包含該字段,而是在必要時使用它進行分類。
編輯:我會去與3 - 這樣的出版物將更有效率
在服務器端,您可以嘗試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);
}
}
我已經成功使用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值。然後在排序操作完成後從結果文件中刪除時間字段。
我收集你的意思是,考慮到「降序」,你希望兩個值中的「最大」被考慮進行排序。 MongoDB不能在'.sort()'操作中應用「計算」,它需要一個當前字段。無論是應用'.aggregate()'語句來計算還是在每次更新時都使用['$ max'](https://docs.mongodb.org/manual/reference/operator/update/max/)更新操作符來更新在文檔中保留一個「maxTime」字段,然後可以對其進行排序。 –
@BlakesSeven謝謝,我改變了一點問題,對方有沒有辦法? –
這真的是一回事。原則上這與這個問題並沒有什麼不同,[「按最大數組字段升序或降序排序」](http://stackoverflow.com/questions/35374433/sorting-by-maximum-array-field-ascending-or -descending/35389089#35389089),唯一真正的區別在於,這是「兩個不同的字段」,而不是「數組」。但要解決的原則仍然是一樣的。通常情況下,**總是**最好將您的文檔中的字段存儲爲您想要排序的值。 –