답변:
내 벤치 마크를 기반으로하는 것 보다 find().limit(1)
수십 배 빠릅니다findOne()
.
MongoDB 문서에 오류가 있거나에 버그가 findOne()
있습니다. findOne()
같은 더 수행 find().limit(N)
N 쿼리가 반환 된 문서의 번호입니다. 내 간단한 쿼리가 왜 그렇게 느린 지 알아 내려고 노력하면서 이것을 알아 냈습니다!
업데이트 : 10gen (MongoDB) 엔지니어의 응답 :
실행중인 두 쿼리는 매우 다릅니다. 찾기 쿼리는 커서를 반환합니다. 실제 데이터가 반환되지 않으므로 커서가 작동하지 않는 시나리오입니다 (커서 정보 만). findOne을 호출하면 실제로 데이터를 반환하고 커서를 닫는 것입니다. 문서는 분명히 명확해야합니다 :-)
업데이트 : 실제로 find().limit(1)
문서를 검색하면 속도 차이의 차수가 사라지는 것처럼 보입니다. 또한 MongoDB JavaScript 드라이버로 주요 속도 차이를 재현 할 수 없었습니다. 원래 MongoDB Java 드라이버를 사용하여 벤치마킹했습니다.
findOne()
보다 낫다는 결론을 내릴 수 find().limit(1)
있습니다.
findOne()
참으로 문법 설탕 을위한 find().limit(1)
, 당신이 실제로 문서를 검색하는 주어진 (단지 커서를 반환 반대 find()
).
자세한 내용은 Leftium의 답변 및 업데이트를 참조하십시오 .
소스 코드는 많은 도움이 될 수 있습니다.
자바이지만 도움이 될 것 같습니다.
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()
합니까?