【问题标题】:mongodb / mongoose - sort by two fieldsmongodb / mongoose - 按两个字段排序
【发布时间】:2019-03-19 08:14:45
【问题描述】:

我有两个字段:

  • 日期 (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
});

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

提前谢谢你

【问题讨论】:

  • 说“它在某些方面失败了”是模糊和无益的。预期的行为是什么,您看到的是什么?请描述并提供一个简单的例子。

标签: javascript arrays node.js mongodb mongoose


【解决方案1】:

要实现这一点,您可以使用 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 中测试。

在 Mongoose 中聚合:

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);
});

【讨论】:

  • 如何与猫鼬一起使用?
猜你喜欢
  • 2019-10-19
  • 2015-01-20
  • 2012-11-07
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2015-09-19
  • 2021-04-19
  • 1970-01-01
相关资源
最近更新 更多