MongoDB:自动按升序排序文档

cedebl8k  于 2023-02-11  发布在  Go
关注(0)|答案(1)|浏览(165)

我在数据库集合中有一个文档列表。排序的文档通过前端拖放功能进行更改。文档的order字段按升序排序所有文档。例如,

[{
  order: 1,
  no: 1
  ......
},
{
  order: 2,
  no: 2
  ......
},
{
  order: 3,
  no: 3
  ......
}]

现在,当拖放应用时,它可能会更改为不同的格式。例如-

[{
   order: 3,
   no: 1
   ......
 },
 {
   order: 1,
   no: 2
   ......
 },
 {
   order: 2,
   no: 3
   ......
 }]

现在从前端开始对列表进行排序已经不是问题了,稍后通过点击按钮,一条新的记录就会添加到列表的顶部,从客户端重新按升序排序也完全不是问题。

实际发放

我在页面上有分页,所以每次我都不能从客户端编程中对所有项目进行排序。应该只有/best方法可以从MongoDB查询中对它们进行排序。例如,使用下面的查询我可以对文档进行排序-

db.collection.aggregate([
  {
    "$sort": {
      order: 1
    }
  }
])

但是如果order字段有重号或者没有任何数值,上面的查询就无法排序,有没有查询可以自动对顺序字段进行升序排序,不管重号还是没有数值?
例如,如果我们有以下格式的文档-

[
  {
    order: null,
    no: 1,
    ...
  },
  {
    order: 1,
    no: 2,
    ...
  },
  {
    order: 1,
    no: 3,
    ...
  },
  {
    order: 3,
    no: 4,
    ...
  },
]

则应转换为-

[
  {
    order: 1,
    no: 1,
    ...
  },
  {
    order: 2,
    no: 2,
    ...
  },
  {
    order: 3,
    no: 3,
    ...
  },
  {
    order: 4,
    no: 4,
    ...
  },
]
2ul0zpep

2ul0zpep1#

我们可以使用$addFields$ifNull来设置查询中可空字段的默认值

db.collection.aggregate([
  {
    $addFields: {
      order: { $ifNull: ["$order", "$order", -1] }, // order will be -1 if it is null
    },
  }
])
.sort({ order: 1 });

相关问题