mongodb中的文档排序

mongodb中的文档排序,mongodb,sorting,Mongodb,Sorting,假设我收集了四份文件: {u'a': {u'time': 3}} {u'a': {u'time': 5}} {u'b': {u'time': 4}} {u'b': {u'time': 2}} 是否可以按“a”和“b”文档中常见的“时间”字段对它们进行排序 谢谢您可以使用,以下代码已经过测试 db.test.aggregate({ $project: { time: { "$cond": [{ "$

假设我收集了四份文件:

{u'a': {u'time': 3}}
{u'a': {u'time': 5}}
{u'b': {u'time': 4}}
{u'b': {u'time': 2}}
是否可以按“a”和“b”文档中常见的“时间”字段对它们进行排序

谢谢

您可以使用,以下代码已经过测试

 db.test.aggregate({
      $project: {
          time: {
              "$cond": [{
                  "$gt": ["$a.time", null]
              }, "$a.time", "$b.time"]
          }
      }
  }, {
      $sort: {
          time: -1
      }
  });
或者,如果您还希望返回原始字段:

或者,您可以在返回结果后,使用自定义的比较功能进行排序(未测试,仅供说明)


不,您应该将数据转换为公共格式,以便可以在公共字段中对其进行排序。如果需要,它仍然可以嵌套,但需要具有相同的路径

您可以使用
聚合框架

  • 这里的技巧是将
    $project
    作为所有文档的公共字段,以便
    $sort
    阶段可以使用该字段中的值对文档进行
    排序
  • 操作员可用于检查
    a.时间是否存在
    则记录将按该值排序,否则按
    b.time
代码:

此方法的后果

  • 聚合管道
    不会被任何
    索引
    覆盖 创造
  • 对于非常大的数据集,性能将非常差
理想情况下,您可以要求发送数据的源系统对其格式进行标准化,例如:

{"a":1,"time":5}
{"b":1,"time":4}
这样,如果在
时间
字段上创建索引,您的查询就可以使用
索引

db.t.ensureIndex({"time":-1});
代码:


它不会对格式为
{b:{time:2}}
的文档进行排序问题是我不能将“我的数据”放在一个通用格式中,因为它不是我的数据,而是给我的任何东西。“相同的路径”让我想起了几年前我看到的一个问题,mongodb是否会有类似XPath的查询。我想知道这个想法到底发生了什么所以。。。您可以创建索引(高效查询时间值需要该索引),但不能更改数据库中的数据?!??为什么呢?您对数据库有什么权限?您对系统中的其他代码有什么控制?谢谢大家的评论和建议。“对于非常大的数据集,性能将非常差。”这显然是一个阻碍。我不妨把申请表中的文件分类。至于数据本身,我没有发布真实的数据,因为首先这些是相当复杂的文档。我只是创建了一个简单的例子,它直指问题的核心,“在应用程序中对文档进行排序”——我想我已经建议了两个选项,包括这个选项。你认为这是你的解决方案吗?另一方面,如果您可以在客户端处理数据集,那么聚合方法的性能可能不会那么差。最后知道哪种方法最适合你会很有趣。
{"a":1,"time":5}
{"b":1,"time":4}
db.t.ensureIndex({"time":-1});
db.t.find({}).sort({"time":-1});