OneCollection.find({}, {sort: {time1: -1, time2: -1}});
这一个time1
优先于time2
。
我想基于两个字段进行排序。
无论哪种方式都可以。感谢
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
3条建议:
对客户端进行排序 - 这样您只需使用arr.sort([compareFunction])
转换出版物并添加字段https://www.eventedmind.com/items/meteor-transforming-collection-documents
将sortfield添加到数据模型(更新现有数据),以及将来保存/编辑对象时还添加/编辑sortfield。不要在出版物中包含该字段,但必要时使用它进行排序。
编辑:我会选择3 - 这样出版物会更有效率
答案 2 :(得分: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 } }
]);
它会暂时添加 time 字段 time1 值,如果它存在并且大于 time2 值或 time2 值,否则使用它进行排序。然后,在排序操作完成后,它会从结果文档中删除时间字段。