mongodb / mongoose-按两个字段排序

时间:2018-10-14 22:30:17

标签: javascript arrays node.js mongodb mongoose

我有两个字段:

  • 日期(ISODate
  • 值(它是number-也可以是undefined

我想按特定方式对它们进行排序。

首先-按value排序。如果存在(不存在undefined),请让他们先行。如果未定义value,请在末尾推送这些对象。

第二-按date排序。因此,此刻,我们将按value进行排序。但是现在我想按date对其进行排序。

预期结果:

[
   {
      value: 1, 
      date: today, // ofc it's a date but just to represent the case
   }, 
   {
      value: 2,
      date: yesterday,
   },
   {
      value: undefined,
      date: today,
   },
   {
      value: undefined,
      date: yesterday,
   }
]

当前解决方案:

.sort({
  value: -1,
  date: -1
});

但是在某些情况下它失败了,不幸的是,我无法检测为什么有时会以错误的方式对它进行排序。但这确实...

提前谢谢

1 个答案:

答案 0 :(得分:2)

  

要实现此目的,您可以将aggregate$cond一起使用。

db.getCollection('collectionName').aggregate([
{
   $project :
       {
           "id" : 1,
           "value" : 1,
           "date": 1,
           sortValue: {
            $cond: {
              if: { $eq: ['$value',undefined ]},
              then: 0, 
              else: 1,
            },
          }
       }
},
{
   $sort :
       {
           "sortValue" :-1,
           "value" : 1,
           "date" : -1
       }
}])
  

在Mongo GUI中测试。

猫鼬总计:

Model.aggregate([
  {
    $project:
    {
      "id": 1,
      "value": 1,
      "date": 1,
      sortValue: {
        $cond: {
          if: { $eq: ['$value', undefined] },
          then: 0,
          else: 1,
        },
      }
    }
  },
  {
    $sort:
    {
      "sortValue": -1,
      "value": 1,
      "date": -1
    }
  }
], function (err, result) {
  if (err) {
    console.log(err);
    return;
  }
  console.log(result);
});