私はプロジェクトに取り組んでいfind
ますが、カーソルの動作とカーソルの動作に違いがあるかどうかはわかりませんfindOne
。findOneは単なるラッパーfind().limit(1)
ですか?私はそれを探していましたが、mongodbに特別な方法があるかどうかを誰かが知っているかもしれません。それが違いを生むのであれば、mongodbのPHP APIを使用しています。
私はプロジェクトに取り組んでいfind
ますが、カーソルの動作とカーソルの動作に違いがあるかどうかはわかりませんfindOne
。findOneは単なるラッパーfind().limit(1)
ですか?私はそれを探していましたが、mongodbに特別な方法があるかどうかを誰かが知っているかもしれません。それが違いを生むのであれば、mongodbのPHP APIを使用しています。
回答:
私自身のベンチマークに基づいて、find().limit(1)
はのよりも桁違いに高速ですfindOne()
。
MongoDBのドキュメントに誤りがあるか、にバグがありfindOne()
ます。Nは、クエリが返すドキュメントの数にfindOne()
似find().limit(N)
ています。私の単純なクエリがなぜそんなに遅いのかを理解しようとして、私はこれを理解しました!
更新: 10gen(MongoDB)エンジニアからの応答:
実行する2つのクエリは非常に異なります。検索クエリはカーソルを返します。これは、実際のデータ(カーソル情報のみ)が返されないため、基本的に操作なしのシナリオです。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()
していますか?