2012-09-19 7 views
0

나는 수많은 문서가있는 웹 응용 프로그램을 가지고 있습니다. 사용자는 ID (유효한 MongoId/ObjectId)를 입력 할 수 있지만 사용자가 입력하지 않으면 마지막 ID가있는 객체를 검색해야합니다.마지막 문서를 반환 할 때의 MongoDB 속도

마지막 객체 검색 속도가 걱정됩니다. 현재 다음과 같이하고 있습니다.

db.docs.find({"status": 1}).sort({"_id": -1}).limit(1); 
//Or in php: 
$docs->find(array('status' => 1))->sort(array('_id' => -1))->limit(1)->getNext(); 

조금 느리지 않습니까? 먼저 상태 1 인 모든 문서를 찾고 정렬 한 다음 제한합니다. 상태 1로 마지막 문서를 가져 오는 더 좋은 방법이 있습니까?

답변

1

아마도 시스템이 status = 1 인 가장 높은 id 값을 나타내는 또 다른 값을 다른 테이블이나 메모리 캐시에 저장할 수 있습니다. 데이터베이스에 객체를 삽입/업데이트 할 때 상태가 1 인 객체의 id 값과 현재 캐시 된 id 값을 비교하고 값이 더 높은 경우 업데이트하는 작은 비트가 필요합니다. 그런 다음이 캐시 된 값을 사용하여 최신 파일에 직접 액세스 할 수 있습니다.

조금 어수선하지만 개체 수가 늘어남에 따라 현재 수행중인 find.sort.limit 작업보다 훨씬 잘 수행 할 수 있습니다.

2

이 공연을 만들려면 { status: 1, _id: -1 }에 색인을 추가해야 할 수 있습니다.

또한 구문을 단순화하기 위해 한계와 findOne를 사용하는 대신 찾을 수 있습니다

db.docs.findOne({"status": 1}).sort({"_id": -1}); 
관련 문제