在mongodb中排序文档

时间:2015-02-13 00:21:30

标签: mongodb sorting

我们说我的收藏中有四份文件:

{u'a': {u'time': 3}}
{u'a': {u'time': 5}}
{u'b': {u'time': 4}}
{u'b': {u'time': 2}}

是否可以按字段对时间进行排序' time'这在“a'和' b'文件?

谢谢

3 个答案:

答案 0 :(得分:0)

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

 db.test.aggregate({
      $project: {
          time: {
              "$cond": [{
                  "$gt": ["$a.time", null]
              }, "$a.time", "$b.time"]
          }
      }
  }, {
      $sort: {
          time: -1
      }
  });

或者,如果您还想要返回原始字段:gist

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

db.eval(function() { 
  return  db.mycollection.find().toArray().sort( function(doc1, doc2) { 
       var time1 = doc1.a? doc1.a.time:doc1.b.time,
           time2 = doc2.a?doc2.a.time:doc2.b.time;
       return time1 -time2;
     })
});

答案 1 :(得分:0)

不,您应该将数据放入通用格式,以便在公共字段上对其进行排序。如果你想要它仍然可以嵌套,但它需要具有相同的路径。

答案 2 :(得分:0)

您可以使用aggregation framework

  • 这里的诀窍是$project所有文档的公共字段,以便$sort阶段可以使用该字段中的值来sort文档。
  • $ifNull运算符可用于检查a.time是否存在 然后,记录将按照b.time的其他值排序。

代码:

db.t.aggregate([
{$project:{"a":1,"b":1,
           "sortBy":{$ifNull:["$a.time","$b.time"]}}},
{$sort:{"sortBy":-1}},
{$project:{"a":1,"b":1}}
])

consequences这种做法:

  • 任何aggregation pipeline你都不会index 创建
  • 对于非常大的数据集,性能将非常差。

理想情况下,您可以询问向您发送数据的源系统,以标准化其格式,例如:

{"a":1,"time":5}
{"b":1,"time":4}

如果您在index字段中创建一个time,那么您的查询可以使用db.t.ensureIndex({"time":-1});

db.t.find({}).sort({"time":-1});

代码:

{{1}}