2014-06-20 2 views
1

저는 mongodb 2.4.3을 호출자와의 거리를 기반으로 프로파일을 반환하는 소셜 네트워킹 응용 프로그램에 사용했습니다.

db.profiles.find({loc: {$nearSphere: <lon, lat>}} ...).skip(0).limit(100); 

나는 그러나 그것은 일종의 거리, 결과 세트를 수행하는 $ nearSphere 연산자는 100 개 개의 결과를 반환하는 것을 알고 내가 필요하고, 내 응용 프로그램 페이지의 결과 때문에하는 다음과 같이 나는 $ nearSphere 연산자를 사용 100의 배수 어쨌든, 난 그냥 다음과 같이 건너 뛰기 값을 증가시켜 거리만큼 프로파일 목록을 반복 할 수 있었다 :

db.profiles.find({loc: {$nearSphere: <lon, lat>}} ...).skip(100).limit(100); 
db.profiles.find({loc: {$nearSphere: <lon, lat>}} ...).skip(200).limit(100); 
db.profiles.find({loc: {$nearSphere: <lon, lat>}} ...).skip(300).limit(100); 

이 약 1 년 동안 좋은 일하고있다. 나는 최근에 2.6.1로 업그레이드했고, 이제는 값을 건너 뛰어도 상관없이 처음 100 개의 결과 만 반환된다는 것을 알게되었습니다. 이후이 기능을 다시 사용하려면 v2.4.3으로 다운 그레이드해야했습니다.

제 질문은이 동작이 2.4.3의 버그입니까, 2.6.1의 버그입니까? 문서에서는 내가 알 수있는 한이 변경 사항을 언급하지 않습니다. 2.4.3의 버그가 발생했을 때 동일한 기능을 유지하면서 적응하는 가장 좋은 방법은 무엇입니까? 감사!

+0

'2dsphere'색인 또는 '2d'를 사용합니까? – surui

+0

호기심에서 벗어난 2 차원 색인 –

+0

을 사용하고 있는데 왜이 색인에 2 차원 색인을 사용하지 않고 2 차원 색인을 사용합니까? – surui

답변

3

당신이 말한 100 한계는 '2d'색인만을위한 것이므로 '2d'색인을 사용하고있는 것 같습니다. 버전 2.6.3에서 테스트 한 내용 (그리고 최신 버전으로 업데이트하기 전에 2.6.0)에서이 특정 쿼리의 제한이 건너 뛰기를 고려하지 않는 버그가있는 것 같습니다. 따라서 건너 뛰면 100까지는 100 + limit으로 제한해야합니다.

은 (몽고 클라이언트에서) 재현 :

db.test.drop(); 
db.test.ensureIndex({point: "2d"}); 
for (var i = 0; i < 200; ++i) { 
    db.test.insert({point:[1,2]}); 
} 
db.test.insert({point:[1,2.01]}); 
db.test.find({point: {$nearSphere: [1,2]}}).skip(200).limit(201); 

결과 :

{ "_id"ObjectId가 ("53a476c6c83c83ebdd121038")을, "포인트"[1 2.01]}

당신

db.test.find({point: {$nearSphere: [1,2]}}).skip(200).limit(1); 
,

아무 것도 없습니다. 당신이

db.test.find({}).skip(200).limit(1) 

반환 비교

, { "_id": ObjectId가 ("53a476c6c83c83ebdd121038을"), "포인트": 1, 2.01]}

'2dsphere'의 경우 예상대로 작동합니다.

+0

https://jira.mongodb.org/browse/SERVER-14329 – surui

+0

에 문제점을 열었습니다. 감사합니다. 2.6으로 업그레이드하기 전에 수정을 기다려라. –