我想获取最新文档,这显然是一个单独的文档,因此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()
两者都工作正常,我只是想知道我更喜欢哪个查询?在性能方面,或者两者在内部的工作方式是否相同,两者之间没有这种差异。
答案 0 :(得分:23)
自Mongo 3.2起,$orderby
为deprecated。
不推荐使用$ 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
支持查询修饰符,而功能访问器则不支持,这可能是使用查询修饰符的原因。