2017-10-22 1 views
1

쿼리가 있지만 쓰기 방법을 모르겠습니다. 임베디드 포인트가있는 투어 컬렉션이 있습니다.배열에서 시작 및 끝 요소를 순서대로 쿼리하는 방법?

{ 
    _id: "my tour", 
    points: [ 
     {_id: '1', point: 'A'}, 
     {_id: '2', point: 'B'}, 
     {_id: '3', point: 'C'}, 
     {_id: '4', point: 'D'} 
    ] 
} 

B C에서 & 끝에 사용자 검색 투어 시작 나는이 문서를 나열 할 때

그러나 사용자 검색시 : 투어가 표시되지 않습니다 B의 C & 끝에서 시작합니다.

어떻게이 쿼리를 작성할 수 있습니까? 배열 항목의 선택에 "이"조건이 있기 때문에

+0

무엇을 시도 했습니까? . – Wndrr

+0

db.getCollection ('여행') 집계 ([ { $ 일치 : { '점': { $ elemMatch : {$와 [ { 국가 '미국', 점 : '598c156bfd081c2ca0d82319' }, 는 { 국가 '미국', 점 : '598c156bfd081c2ca0d82335' }, ]} } } } – thankdev

답변

0

는 현재 $elemMatch를 사용 조건이 "B"와 "C"와 요소 모두에 해당하기 때문에

var start = "B", 
    end = "C"; 

db.getCollection('nest').find({ 
    "points": { 
    "$elemMatch": { 
     "point": { "$gte": start, "$lte": end } 
    } 
    } 
}) 

문서를 선택겠습니까, 그러나 순서를 반대로 없음 요소 "B"에 작거나 같은 값 모두 크거나 같다 "C"도 만족이 없기 때문에

var start = "C", 
    end = "B"; 

db.getCollection('nest').find({ 
    "points": { 
    "$elemMatch": { 
     "point": { "$gte": start, "$lte": end } 
    } 
    } 
}) 

조건은 어떤 배열 요소 사실이 아니다.

이렇게 주문을 시행하는 방법이며, 데이터 자체가 항상 그런 식으로 주문되어있는 한 괜찮습니다.

당신은 그 자체가 역에 표시되는 데이터가있는 경우 :

{ 
    _id: "my tour", 
    points: [ 
     {_id: '4', point: 'D'}, 
     {_id: '3', point: 'C'}, 
     {_id: '2', point: 'B'}, 
     {_id: '1', point: 'A'} 
    ] 
} 

그리고 당신은 앞으로 "배열 인덱스"에 의해 진행을 나타내는 "B"에서 "C"와 마지막에 "시작"하고 싶어, 다음을

var start = "B", 
    end = "C"; 

db.getCollection('nest').aggregate([ 
    { "$match": { 
    "points.point": { "$all": [start,end] } 
    }}, 
    { "$redact": { 
    "$cond": { 
     "if": { 
     "$and": [ 
      { "$gt": [ 
      { "$indexOfArray": [ "$points.point", start ] }, 
      { "$indexOfArray": [ "$points.point", end ] }, 
      ]} 
     ] 
     }, 
     "then": "$$KEEP", 
     "else": "$$PRUNE" 
    } 
    }} 
]) 

그래서 여기에 최고의 조언 배열하면 계산으로 할 수 있지만, 원시 쿼리가 훨씬 더 성능이 좋은이기 때문에 즉, 어휘 범위에 대한 검색이 주문한 유지하는 것입니다 : 당신은 계산 된 진술이 필요합니다.

+0

당신은 GTE $를 사용하여 $이 경우 LTE 없습니다 – thankdev

+0

을 @thankdev 당신은 할 수 있습니다. 네가 그것을 올바르게 디자인한다면, 나는 아직도 글쓰기를하고있다. 입니다. 읽고 이해하십시오. –

+0

우리가이 조건을 결합하기 위해 더 많은 필드를 추가하면 어떻게 생각하십니까 [ "AB", "AC", "AD", "BC", "BD", "CD", "AA", "BB", "CC ","DD "] – thankdev

관련 문제