我想获取最新的文档,这显然是一个单独的文档,因此findOne
应该工作正常.但findOne
这里返回插入的第一个文件.所以,我有两个选择现在要么使用$orderBy
有findOne
或使用.sort()
功能与.limit()
在find()
使用$ orderBy它看起来像:
db.collection.findOne({$query:{},$orderby:{_id:-1}})
Run Code Online (Sandbox Code Playgroud)
并使用排序:
db.collection.find().sort({_id:-1}).limit(1).pretty()
Run Code Online (Sandbox Code Playgroud)
两者都工作正常,我只是想知道我更喜欢哪个查询?在性能方面,或者两者在内部的工作方式相同,两者之间没有这种差异.
Jef*_*man 28
截至Mongo 3.2,$orderby
已被弃用.
该文件明确地说:
$ orderby运算符已弃用.请改用cursor.sort().
不幸的是,findOne()
不支持该sort()
方法,因此您需要切换到find()
:
db.collection.find({}).sort({'key': -1}).limit(1)
Run Code Online (Sandbox Code Playgroud)
这将返回a cursor
,因此您需要从光标中提取第一个结果.
Sam*_*aye 19
它们是相同的,实际上是$orderby
实际谈论的文档页面主要是关于提供的sort()
功能.
这些查询修饰符允许您在不使用功能访问器的情况下添加查询的部分,但确实存在将这两者混合在一起的错误,因此我建议您选择查询修饰符或功能方法并坚持使用该选项.
在尝试提供示例代码时,我还发现了另一件事,当我再次查看您的问题时.你提供:
db.collection.findOne({"$query":{},"$orderby":{ "_id": -1 }})
Run Code Online (Sandbox Code Playgroud)
但值得注意的是:
db.collection.findOne({}).sort({ "_id":-1})
Run Code Online (Sandbox Code Playgroud)
实际产生:
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") }
Run Code Online (Sandbox Code Playgroud)
答案其实是正确的:
> 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")
}
Run Code Online (Sandbox Code Playgroud)
因此,值得注意的是findOne
,函数访问器不在哪里支持查询修饰符,这可能是使用查询修饰符的原因.
归档时间: |
|
查看次数: |
24266 次 |
最近记录: |