我正在一个项目上,我不确定find
游标的工作方式和游标的工作方式之间是否有区别findOne
。是findOne的包装find().limit(1)
吗?我一直在寻找它,也许有人知道mongodb是否具有特殊的方法。我正在为mongodb使用PHP API,如果有所作为。
我正在一个项目上,我不确定find
游标的工作方式和游标的工作方式之间是否有区别findOne
。是findOne的包装find().limit(1)
吗?我一直在寻找它,也许有人知道mongodb是否具有特殊的方法。我正在为mongodb使用PHP API,如果有所作为。
Answers:
根据我自己的基准,比快find().limit(1)
几个数量级。findOne()
MongoDB文档中有错误或中的错误findOne()
。findOne()
执行起来更像find().limit(N)
N,其中N是查询将返回的文档数。我在试图弄清楚为什么我的简单查询这么慢的时候就想到了这一点!
更新:来自10gen(MongoDB)工程师的回复:
您正在执行的两个查询非常不同。查找查询返回一个游标,这本质上是无操作的情况,因为没有返回实际数据(仅返回游标信息)。如果调用findOne,则实际上是在返回数据并关闭游标。该文档绝对应该更清晰:-)
更新:确实,如果find().limit(1)
检索到文档,则数量级速度差异似乎消失了。而且,我无法重现MongoDB JavaScript驱动程序的主要速度差异。我最初使用MongoDB Java驱动程序进行基准测试。
findOne()
则比差find().limit(1)
,这是不正确的。
findOne()
的确是语法糖的find().limit(1)
,因为你实际上检索文档(而不是仅仅返回光标find()
)。
有关更多详细信息,请参见Leftium的答案和更新。
源代码可能会有所帮助。
它是Java,但我想它也可以提供帮助。
的findOne()
,
DBObject findOne(DBObject o, DBObject fields, DBObject orderBy, ReadPreference readPref,
long maxTime, TimeUnit maxTimeUnit) {
QueryOpBuilder queryOpBuilder = new QueryOpBuilder().addQuery(o).addOrderBy(orderBy)
.addMaxTimeMS(MILLISECONDS.convert(maxTime, maxTimeUnit));
if (getDB().getMongo().isMongosConnection()) {
queryOpBuilder.addReadPreference(readPref);
}
Iterator<DBObject> i = find(queryOpBuilder.get(), fields, 0, -1, 0, getOptions(), readPref, getDecoder());
DBObject obj = (i.hasNext() ? i.next() : null);
if ( obj != null && ( fields != null && fields.keySet().size() > 0 ) ){
obj.markAsPartialObject();
}
return obj;
}
这是 find()
public DBCursor find( DBObject ref ){
return new DBCursor( this, ref, null, getReadPreference());
}
正如我们可以看到,findOne()
调用find()
它的自我,得到所有的DBOject
中i
,然后返回第一个。
您必须检查此链接...
http://mongoosejs.com/docs/2.7.x/docs/finding-documents.html
find().limit(1)
正常编程过程中(无论是实际获取数据还是关闭游标)在任何情况下都会findOne()
自动为您执行的额外操作?