按两个字段的聚合排序

时间:2014-03-27 14:47:35

标签: c# mongodb aggregation-framework

我有一个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,而不是我的客户端代码。

3 个答案:

答案 0 :(得分:1)

如果您希望仅预测有效日期和更长日期,请使用aggregate运算符和$cond运算符$gt。翻译的基本shell示例(并不难):

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

因此,基本上会将您的文档分解为具有" date"字段设置为这两个字段中的任何一个具有更大的值。然后你可以对结果进行排序。所有已处理的服务器端。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Use Indexes to Sort Query Results

  

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