MongoDB无法乘以日期

时间:2016-08-25 19:46:04

标签: mongodb

对于集合,我尝试按日期对文档进行排序,但顺序可能因其他条件而异。例如

{ _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类型。)

并且应对其进行排序,使etastatus = '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约会,我就无法加倍。那么,我如何将日期字段转换为数字,以便我可以将其相乘?我是否需要创建另一个领域?

**编辑**

来自documentation

  

在内部,Date对象存储为64位整数,表示自Unix纪元(1970年1月1日)以来的毫秒数,这导致过去和未来的可表示日期范围约为2.9亿年。

因此,如果将日期存储为数字,那么如何在聚合期间直接操作此值?

**编辑2 **

某些date operators,但没有一个以毫秒为单位返回整个日期!

2 个答案:

答案 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日期和完整日期,其中不完整的项目没有完整日期的值,而不能以不同的方式排序。