假设我有以下数据:

Time Submitted
1 True
2 True
3 True
4 False
5 False
6 False

我的目标是要么提交最老的未提交的,要么提交最新的.这是为了加载用户时间表,所以如果他们有一个旧的未提交的时间表,我想默认加载它.如果没有,我想向他们展示他们最新的时间表.

在查询之后,我希望数据按以下顺序返回:

Time Submitted
4 False
5 False
6 False
3 True
2 True
1 True

请注意,前3条记录为false,因此它们按升序时间排序,而后3条记录为true,因此它们按降序时间排序.

以下是MongoPlace的数据样本:

https://mongoplayground.net/p/yEtgMOfZ_ik

我猜这可以通过投射一些值来作为排序依据来完成,但我无法理解这需要什么.

推荐答案

您已经在submitted上进行了排序:在true之前有false个排序(在许多语言中是0对1).👍,所以这是排序的第一个关键字.

如果是submitted=false,你想要时间的升序(4,5,6),当它是true时,你想要opposite.

您可以创建一个额外的键来根据是否提交来对时间进行排序,并在提交时使用negative-numbers来更改排序顺序.

在这里,我正在创建timeSort,它将否定submitted=true的时间.因此,3变为-3,按升序变为-3;-2&1.而4、5、6则按升序保持原样.

db.collection.aggregate([
  {
    $set: {
      timeSort: {
        $multiply: [
          "$time",
          { $cond: [ "$submitted", -1, 1 ] }
        ]
      }
    }
  },
  {
    $sort: {
      submitted: 1,
      timeSort: 1
    }
  },
  { $unset: "timeSort" }
])

你可以把$cond的1和-1和$sorttimeSort反转,得到相同的结果.

[
  { "time": 4, "submitted": false },
  { "time": 5, "submitted": false },
  { "time": 6, "submitted": false },
  { "time": 3, "submitted": true },
  { "time": 2, "submitted": true },
  { "time": 1, "submitted": true }
]

Mongo Plaground

Mongodb相关问答推荐

我们可以在Mongoose中这样使用Unique:[True,";This to Unique&qot;]吗

Mongo $sort然后$group,顺序能保证吗?

如何更新mongo中列表最后一个对象的属性

判断对象数组中的值是否存在golang

Mongoose 返回包含属性内任何位置的值的所有文档

为什么一个 mongodb 副本集需要奇数个投票 node ?

PHP 无法加载动态库 (mongo.so)

db.createCollection 不是函数

Mongoexport 在日期范围内使用 $gt 和 $lt 约束

无法连接到mongolab主机

Mongodb插入没有_id字段的文档

用 BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId 在 C# 中装饰属性之间的区别

Mongoose 中不同集合的相同模式

MongoDB 查找精确的数组匹配,但顺序无关紧要

使用 Mongoid 和 Ruby 查询最近 30 天的日期范围?

使用已排序的数据获取不同的值

具有简单密码认证的 MongoDB 副本集

无法使用命令写入模式错误,降级到兼容模式

如何在mongoDB中检索其值以特定字符结尾的文档

show dbs 给出Not Authorized to execute command错误