按两个字段的总和排序
本文关键字:排序 字段 两个 | 更新日期: 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)
使用索引对查询结果进行排序
要对多个字段进行排序,请创建复合索引。