我有一个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,而不是我的客户端代码。
答案 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
要对多个字段进行排序,请创建复合索引。