按两个字段的总和排序

本文关键字:排序 字段 两个 | 更新日期: 2023-09-27 17:53:57

我有一个mongo数据库,其中的文档看起来像这样:

{
    PublishedDate: [date],
    PublishedDateOverride: [NullableDate],
    ...
}

我将覆盖作为一个单独字段的原因是,知道原始发布日期以及覆盖日期是很重要的。

当我得到这些文档时,我想按照它们的"明显"发布日期对它们进行排序。也就是说,如果有重写,它应该使用它,否则使用原始的。

我们当前的系统只是先按PublishedDateOverride排序,然后按PublishedDate排序,当然,这将所有具有null覆盖的组合在一起。

以以下四个文档为例:

A = {
    PublishedDate: 2014-03-14,
    PublishedDateOverride: 2014-03-24,
    ...
}
B = {
    PublishedDate: 2014-01-21,
    PublishedDateOverride: 2014-02-02,
    ...
}
C = {
    PublishedDate: 2014-03-01,
    PublishedDateOverride: null,
    ...
}
D = {
    PublishedDate: 2014-03-27,
    PublishedDateOverride: null,
    ...
}

期望排序顺序为D(2014-03-27)、A(2014-03-14)、C(2014-03-01)、B(2014-02-02)。

我需要能够在数据库中做到这一点,因为我也在分页这些数据,所以我不能在将其从数据库中取出后进行排序。

所以问题是:

实现这一目标的最佳方法是什么?有没有办法按表达式排序?有没有办法有一个计算字段,这样每当我更新一个文档,它会把适当的日期在那里排序?

我在c#中这样做,以防相关,但我会假设任何解决方案都是mongo的,而不是在我的客户端代码中。

按两个字段的总和排序

如果您只想要有效且更大的日期的投影,则使用$cond操作符和$gt操作符的聚合。一个用于翻译的基本shell示例(这并不难):

db.collection.aggregate([
    { "$project": {
        "date": { "$cond": [
            { "$gt": [
                "$PublishedDate",
                "$PublishedDateOverride"
             ]},
             "$PublishedDate",
             "$PublishedDateOverride"
        ]}
    }},
    { "$sort": { "date": 1 } }
])

这基本上将文档分解为将"date"字段设置为这两个字段中值较大的那个。然后你可以对结果进行排序。

try

datesCollection.OrderBy(d => d.PublishedDateOverride!= null? d.PublishedDateOverride: d.PublishedDate)

使用索引对查询结果进行排序

要对多个字段进行排序,请创建复合索引。