对于集合,我尝试按日期对文档进行排序,但顺序可能因其他条件而异。例如
{ _id: 1, name: 'Foo 1', eta: '2016-07-31', status: 'complete' },
{ _id: 2, name: 'Foo 2', eta: '2016-09-16', status: 'pending' },
{ _id: 3, name: 'Foo 3', eta: '2016-07-12', status: 'complete' },
{ _id: 4, name: 'Foo 4', eta: '2016-08-31', status: 'pending' }
(注意:为了这个问题,eta
实际上是Date
类型。)
并且应对其进行排序,使eta
为status = 'pending'
加权,否则降低。
{ _id: 4, name: 'Foo 4', eta: '2016-08-31', status: 'pending' },
{ _id: 2, name: 'Foo 2', eta: '2016-09-16', status: 'pending' },
{ _id: 1, name: 'Foo 1', eta: '2016-07-31', status: 'complete' },
{ _id: 3, name: 'Foo 3', eta: '2016-07-12', status: 'complete' }
所以,我写了一个聚合来添加两个额外的字段:
statusOrder: { $cond: [ { $eq: [ '$status', 'pending' ] }, 0, 1 ] },
etaOrder: { $multiply: [ '$eta', { $cond: [ { $eq: [ '$status', 'pending' ] }, 1, -1 ] } ] }
但似乎如果我可以$add
约会,我就无法加倍。那么,我如何将日期字段转换为数字,以便我可以将其相乘?我是否需要创建另一个领域?
在内部,Date对象存储为64位整数,表示自Unix纪元(1970年1月1日)以来的毫秒数,这导致过去和未来的可表示日期范围约为2.9亿年。
因此,如果将日期存储为数字,那么如何在聚合期间直接操作此值?
某些date operators,但没有一个以毫秒为单位返回整个日期!
答案 0 :(得分:1)
如果使用$subtract
减去两个日期,则结果是以毫秒为单位的差异。因此,您可以使用:
eta
转换为毫秒
{$subtract: ['$eta', new Date(0)]}
所以你可以将它与目前的内容结合起来:
etaOrder: {$multiply: [{$subtract: ['$eta', new Date(0)]},
{$cond: [{$eq: ['$status', 'pending']}, 1, -1 ]}]}
但是你可以简化一下以避免乘法,只需根据$subtract
交换$cond
项:
etaOrder: {$cond: [{$eq: ['$status', 'pending']},
{$subtract: ['$eta', new Date(0)]},
{$subtract: [new Date(0), '$eta']} ]}
答案 1 :(得分:-1)
我同意上面@MarkB的评论。乘法在这里是非感性的。什么是负面日期呢?也许考虑有两个单独的日期来排序eta日期和完整日期,其中不完整的项目没有完整日期的值,而不能以不同的方式排序。