MongoDB $ orderby和Sort之间的区别

时间:2014-07-31 11:41:02

标签: mongodb mongoose

我想获取最新文档,这显然是一个单独的文档,因此findOne应该可以正常工作。但findOne此处返回插入的第一个文档。所以我现在有两个选项:$orderBy使用findOne.sort()使用.limit()函数find()

使用$ orderBy它看起来像:

db.collection.findOne({$query:{},$orderby:{_id:-1}}) 

使用sort:

db.collection.find().sort({_id:-1}).limit(1).pretty()

两者都工作正常,我只是想知道我更喜欢哪个查询?在性能方面,或者两者在内部的工作方式是否相同,两者之间没有这种差异。

2 个答案:

答案 0 :(得分:23)

自Mongo 3.2起,$orderbydeprecated

docs explicitly say

  

不推荐使用$ orderby运算符。改为使用cursor.sort()。

很遗憾,findOne()不支持sort()方法,因此您需要切换到find()

db.collection.find({}).sort({'key': -1}).limit(1)

这将返回cursor,因此您需要从光标中提取第一个结果。

答案 1 :(得分:16)

它们是相同的,实际上$orderby的文档页面实际上主要讨论了提供的sort()函数。

这些允许你在不使用功能访问器的情况下添加查询部分的query modifiers确实存在,但是将这两者混合在一起有一个错误,所以我建议你选择查询修饰符或功能方法,坚持这个选择。

在尝试提供示例代码时,我再次发现了另一件事情。您提供:

db.collection.findOne({"$query":{},"$orderby":{ "_id": -1 }}) 

但值得注意的是:

db.collection.findOne({}).sort({ "_id":-1})

实际产生:

  

2014-07-31T04:59:50.183-0700 TypeError:对象[object Object]没有方法'sort'

正如您在我的测试数据集中所看到的那样:

> db.rooms.find()
{ "_id" : ObjectId("53ad206e1d8f2d8351182830"), "id" : 1, "from" : ISODate("2014-06-26T00:00:00Z"), "to" : ISODate("2014-06-28T00:00:00Z") }
{ "_id" : ObjectId("53ad276f1d8f2d8351182831"), "id" : 1, "from" : ISODate("2014-06-24T00:00:00Z"), "to" : ISODate("2014-07-01T00:00:00Z") }
{ "_id" : ObjectId("53ad28ad1d8f2d8351182832"), "id" : 1, "from" : ISODate("2014-06-20T00:00:00Z"), "to" : ISODate("2014-06-28T00:00:00Z") }
{ "_id" : ObjectId("53ad28c61d8f2d8351182833"), "id" : 1, "from" : ISODate("2014-06-20T00:00:00Z"), "to" : ISODate("2014-07-03T00:00:00Z") }
{ "_id" : ObjectId("53ad29971d8f2d8351182834"), "id" : 1, "from" : ISODate("2014-06-20T00:00:00Z"), "to" : ISODate("2014-06-21T00:00:00Z") }

答案实际上是正确的:

> db.rooms.findOne({ "$query":{}, "$orderby":{ "_id": -1 }})
{
        "_id" : ObjectId("53ad29971d8f2d8351182834"),
        "id" : 1,
        "from" : ISODate("2014-06-20T00:00:00Z"),
        "to" : ISODate("2014-06-21T00:00:00Z")
}

因此有趣的是,findOne支持查询修饰符,而功能访问器则不支持,这可能是使用查询修饰符的原因。