2014-02-12 2 views
1

나와 함께 곰, 이건 내 질문이 아니야. 누군가를 이해하려고 노력하고 있습니다.쿼리가 예상보다 많은 결과를 반환합니다

저자 주 :

possible duplicate 질문 솔루션은 $ elemMatch 때문에>의 모든 요소가 배열되어 제한 할 수 있습니다. 이것은 조금 다릅니다.

따라서 허용되는 답변에서 주요 사항이 제기되었습니다. 이 동작은 은 이며이 아니며은 "사과와 오렌지를"과 비교해서는 안됩니다. 필드는 다른 유형이며, 이에 대한 해결 방법이 있지만 실제 세계에 가장 적합한 솔루션은 입니다.이 아닙니다.

해피 읽기 : 내가 검색하려고 문서의 컬렉션이

이 컬렉션에는 다음이 포함

{ "_id" : ObjectId("52faa8a695fa10cc7d2b7908"), "x" : 1 } 
{ "_id" : ObjectId("52faa8ab95fa10cc7d2b7909"), "x" : 5 } 
{ "_id" : ObjectId("52faa8ad95fa10cc7d2b790a"), "x" : 15 } 
{ "_id" : ObjectId("52faa8b095fa10cc7d2b790b"), "x" : 25 } 
{ "_id" : ObjectId("52faa8b795fa10cc7d2b790c"), "x" : [ 5, 25 ] } 

그래서 나는 결과를 찾을하려는 X1020 사이의 값입니다. 그래서 나에게 논리적 인 듯 쿼리입니다 :

db.collection.find({ x: {$gt: 10, $lt: 20} }) 

는 그러나 문제는이 결과에 두 개의 문서를 반환이다 : 나는 아무도과 두 번째 결과를 볼 것으로 예상하고 있지 않다

{ "_id" : ObjectId("52faa8ad95fa10cc7d2b790a"), "x" : 15 } 
{ "_id" : ObjectId("52faa8b795fa10cc7d2b790c"), "x" : [ 5, 25 ] } 

값은 1020 사이입니다. 내가 예상 한 결과를 얻지 못하는 이유를 설명 할 수 있습니까? 내 생각에 { "x": 15} 만 반환해야합니다.

그렇다면 내가 예상 한 것을 어떻게 얻을 수 있습니까?

+0

이 질문에 의도적 참조 인 [여기] (http://stackoverflow.com/questions/21715121/mongodb-descending-index-weird-behavior) 포스터가 묻지 않는 실제 질문으로되어 있습니다. 그들의 질문은 상황에 따라 답변되었지만,이 부분에 대한 대답은 비슷한 것을 묻는 사람에게 문제를 해결합니다. 누가 옳은 지 알아 봅시다. –

+0

MongoDB가 하위 문서를 필터링하지 않기 때문에 – Sammaye

+0

하위 문서를 필터링하지만 다음과 같은 것은 아닙니다. –

답변

2

이 동작은 mongo 설명서 here에서 예상되고 설명됩니다. 단일 배열 요소 중 하나가 맞는지

쿼리 필드가 배열을 포함하고 쿼리가 여러 조건 사업자가있는 경우 배열을

들어있는 필드는 전체 필드 일치합니다 조건 또는배열 요소 의 조합은 조건를 충족시킵니다.

Mongo는 배열 요소의 조합이 모든 조건과 독립적으로 일치 할 때 결과를 제공함으로써 기꺼이 "잘난 척하는"것처럼 보이고 있습니다.

예에서 5는 $ lt : 20 조건과 일치하고 25는 $ gt : 10 조건과 일치합니다. 그래서, 그것은 일치합니다.

다음의 모두 [5,25] 결과를 반환합니다

db.collection.find({ x: {$gt: 10, $lt: 20} }) 

db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] }) 

을이 사용자의 예상 행동, 의견이 다를 수 있습니다 경우. 그러나 그것은 분명히 문서화되어 있으며 예상되어야합니다.

편집는, 원래의 대답 닐의 가학 아직 높은 교육 편집에 대한 해결책을 요구하십시오 $elemMatch

사용이 어레이 전용은 "엄격한"요소 비교를 할 수 있습니다.

db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } }) 

: 에 [11,25]

나는이 같은 쿼리가 필요할 때 생각 조합 : [11, 12] 이 X이 모두 X 일치합니다 두 개의 쿼리가 필요하며 결과가 결합됩니다. 다음은 x가없는 배열을을 되고있는 문서에 대한 올바른 결과를 반환하는 쿼리입니다 :

db.collection.find({ $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} }) 

그러나이 경우 가장 좋은 방법가 배열이 항상 에 x의 유형을 변경하는 것입니다가, 하나의 요소 만 포함하는 경우에도 마찬가지입니다. 그런 다음 예상 된 동작과 함께 올바른 결과를 얻으려면 $ elemMatch 쿼리 만 필요합니다.

+0

좋은 답변입니다. 다행히 편집 해 주어서 다행입니다. 하지만 질문에 분명한 의미가있는 부분을 추가하겠습니다. –

+0

네, 맞아요. 당신이 내 대답을 본 후에 : P –

+0

@ kocko 1 분 일찍 게시 된 내 대답을 게시 한 후에 나는 그것을 보았다 :) 그리고 우리 둘 다 거기에 도착했다는 것을 미소 지었다.이 문제에 대해 Neil에게 감사하거나 싫어해야하는지 알지 못한다! : P 확실히 나를 가르쳐 줬어. :) – Jinxcat

2

먼저 원하는 값 필터를 하위 문서가 어레이 아닌지 확인하고 제공 할 수

db.collection.find(
    { 
    $and : 
     [ 
     { $where : "!Array.isArray(this.x)" }, 
     { x: { $gt: 10, $lt: 20 } } 
     ] 
    } 
) 

반환 :

{ "_id" : ObjectId("52fb4ec1cfe34ac4b9bab163"), "x" : 15 }  
+0

현재 양식의 쿼리는 전체 수집 스캔을 수행하며 $ 및는 필요하지 않습니다. – Sammaye

+0

$를 사용하지 않으려합니다.제가 읽은 책은 보통 비효율적이라고 말합니다. 페이지 63-66 여기 : http://shop.oreilly.com/product/0636920028031.do –

+0

내 원래의 질문과 유일한 대답 아래의 의견을 참조하십시오 : http://stackoverflow.com/questions/21715121/mongodb-descending -index-weird-behaviour/ –

관련 문제