在MongoDB中同时按多个字段进行排序

3
假设文档中有两个字段updatedAtcreatedAt。 然而,如果文档尚未更新,则文档不一定需要具有updatedAt字段。我想按这两个字段排序,实质上是将这两个字段合并到另一个字段someField中,然后进行排序。
    db.stuff.find({}, { sort: {`someField: -1 } });

我想说的是 当前的组合排序算法
    db.stuff.find({}, {sort: { createdAt: -1, updatedAt: -1 } });

首先按照createdAt进行排序,然后再按照updatedAt进行排序。

2个回答

6
您可以使用聚合管道和$project以及$ifNull操作符来创建两个字段的条件合并。
db.stuff.aggregate([
  { $project:
    { createdOrUpdatedAt: { $ifNull: ["$updatedAt", "$createdAt"] },
      fieldA: 1,
      fieldB: 1,
      fieldEtc: 1 }
  },
  { $sort: { createdOrUpdatedAt: -1 } }
]);

有没有不使用聚合的方式来完成这个任务? - Maaz
1
据我所知,除了在文档创建和更新时创建一个新字段并将其设置为当前时间戳之外,没有其他方法。 - NoOutlet

0

您可以使用聚合方法进行排序、投影等操作。如果您只需要以下内容:

  • 按我的createdAt排序
  • 对于所有具有相同createdAt的字段,按updatedAt排序

那么以下内容将起作用:

db.stuff.aggregate(
   [
     { $sort : { createdAt : -1, updatedAt: -1 } }
   ]
)

我不确定为什么您需要将这两个字段合并到另一个字段中。


1
我认为OP想要一个最近创建或更新的项目列表。因此,如果某个项目昨天创建,但在5分钟前编辑过,则它应该与5分钟前创建(或更新)的项目一起显示,而不是昨天同时创建的其他项目。 - NoOutlet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接