2017-05-12 13 views
0

가 MongoDB를의 컬렉션이 전체 문서 반환MongoDB의 지리 공간 쿼리는 항상 다음과 같습니다

{ 
"_id" : "7613035010550", 
"purchases" : [ 
    { 
     "date" : ISODate("2017-04-15T14:15:00.000Z"), 
     "coords" : { 
      "lon" : 43.729604, 
      "lat" : 1.416017 
     }, 
     "metar" : {}, 
     "quantity" : 1, 
     "price" : 2.31 
    }, 
    { 
     "date" : ISODate("2017-05-02T16:23:00.000Z"), 
     "coords" : { 
      "lon" : 43.722862, 
      "lat" : 1.415837 
     }, 
     "metar" : {}, 
     "quantity" : 6, 
     "price" : 12 
    }, 
    { 
     "date" : ISODate("2017-05-02T18:32:00.000Z"), 
     "coords" : { 
      "lon" : 46.307353, 
      "lat" : 3.28937 
     }, 
     "metar" : {}, 
     "quantity" : 2, 
     "price" : 5 
    } 
], 
"rates" : [ 
    { 
     "value" : 5 
    }, 
    { 
     "value" : 4 
    }, 
    { 
     "value" : 5 
    }, 
    { 
     "value" : 2 
    } 
] 
} 

을 그리고 (A 정의 반경 내에서 수행에만 구매를 반환 할 abble하는 쿼리를 만들 싶습니다 즉, 5km 정도)와 id 주위에만 ... 그러나 나는 이런 종류의 질의를 처리하는 방법을 모른다. 내 exemple에 정의 된 반경 주위에 만들어 구매의 배열 같은 것을 반환 abble로 내가 좋아하는 것 ... 즉, 만 두

db.getCollection('stats').find({"purchases.coords":{$geoWithin:{$centerSphere: [[43.688935, 1.401541], 25/6378.1]}}}) 

그러나 전체 문서를 반환

이 쿼리 :

 { 
     "date" : ISODate("2017-04-15T14:15:00.000Z"), 
     "coords" : { 
      "lon" : 43.729604, 
      "lat" : 1.416017 
     }, 
     "metar" : {}, 
     "quantity" : 1, 
     "price" : 2.31 
    }, 
    { 
     "date" : ISODate("2017-05-02T16:23:00.000Z"), 
     "coords" : { 
      "lon" : 43.722862, 
      "lat" : 1.415837 
     }, 
     "metar" : {}, 
     "quantity" : 6, 
     "price" : 12 
    } 

어떻게 이러한 종류의 쿼리를 수행 할 수 있습니까? 또는 ... 내 컬렉션을 이러한 종류의 쿼리를 만들기 위해 어떻게 정의 할 수 있습니까?

들으, 나는 단계 projectunwind와 집계를 사용하는 것이 좋습니다 것입니다 귀하의 목적

JL

답변

0

.

지금 그것을 확인할 수 없습니다하지만해야 다음과 같습니다

  1. 일치 지정된 조건에 일치하는 모든 문서를 :

    db.getCollection('stats').aggregate([ 
        {'$match': { 
         "purchases.coords": {$geoWithin:{$centerSphere: [[43.688935, 1.401541], 25/6378.1]}} 
        }}, 
        {'$project': { 
         "_id": 0, // 0 - if you don't need document id 
         "purchases": 1, 
        }}, 
        {'$unwind': "$purchases"}, 
        {'$match': { 
         "purchases.coords": {$geoWithin:{$centerSphere: [[43.688935, 1.401541], 25/6378.1]}} 
        }}, 
    ]) 
    

    나는 2 동일한 일치를 사용했습니다.

  2. 모든 unwinded 'purchase'와 일치하는 지정된 조건을 일치시킵니다.

첫 번째 일치하지 않고이 집계를 사용할 수 있지만 조금 느릴 수 있습니다.

어떻게 작동하는지 볼 수 있습니다. 모든 단계에 주석을 달고 하나씩 주석을 제거하면.

+0

Thx 많이 ... 저는 MongoDB와 총 신인입니다.이 솔루션은 정말 효율적입니다. 다음은 PHP 백엔드로이 쿼리를 만들어야합니다 ... lol –