2017-02-09 1 views
1

이 문제가 있습니다. 나는 나에게 값의 목록을 제공하는 쿼리를하고 싶은

{ 
"_id" : ObjectId("58c1a000023409b3b4263c69"), 
"nome" : "hotel", 
"point" : [ 
    { 
     "nome" : "hall", 
     "wiFi" : [ 
      { 
       "ssid" : "ssjjt", 
       "bssid" : "c0:04:25:83:06:30", 
       "rssid" : "-77", 
      }, 
      { 
       "ssid" : "spot", 
       "bssid" : "b8:03:05:3a:80:af", 
       "rssid" : "-34", 
      } 
     ] 
    }, 
    { 
     "nome" : "restorant", 
     "wiFi" : [ 
      { 
       "ssid" : "ssjjt", 
       "bssid" : "c0:04:25:83:06:30", 
       "rssid" : "-76", 
      } 
     ] 
} 

나는

min : -70 
max : - 80 

처럼 PHP, 최대와 최소의 다음 rssid 값이 :이 데이터베이스가 저의 두 가치 사이에 설문 조사가 있습니다.

집계 쿼리를 사용해야합니다.

정말 고마워요.

+0

당신은 쿼리 반환 할 설정 한 예상 JSON 결과를 보여주는 예제를 추가시겠습니까? 그러면 좀 더 정확한 대답을 얻을 수 있습니다. –

+0

안녕하세요. 덕분에 도와주세요. 나는 [ "hall", "restorant"]와 같은 목록을 갖고 싶습니다.
이 두 값은 rssid가 기본값에 포함 된 값이며 호텔 strutture와 동일한 ssid 및 own 값을 갖습니다. 나는 너에게 최선의 방법으로 설명하기를 희망한다. 당신이 나를 도울 수? – AlleBo

+0

db를 변경하고 rssid를 문자열이 아닌 숫자로 저장하는 옵션이 있습니까? 또는 추가 숫자 필드가 있습니까? –

답변

1

여기서 문제는 데이터베이스에 문자열로 rssids가 저장되어 있으며 $ lt 및 $ gte를 적용하여 Mongo가 유형과 관련하여 숫자 값과 비교할 수 없다는 것입니다.

집계 중에 문자열을 숫자로 쉽게 변환 할 수있는 방법이 없습니다. 예를 들어 $ where 절이 집계 중에 허용되지 않습니다.

원하는 것을 얻기위한 첫 번째 방법은 rssid를 Numbers로 유지하거나 원래 문자열을 유지하고 숫자 속성을 추가로 설정하기 위해 데이터베이스를 수정 한 다음 이와 같은 집계를 실행하는 것입니다.

db.getCollection('test').aggregate([ 
    {$unwind: '$point'}, 
    {$match: {'point.wiFi.rssid': {$gte: -80, $lt: -70}}}, 
    //You can omit grouping if you don't need them to be unique 
    {$group: {_id: '$point.nome'}} 
]) 

두 번째 방법은 데이터베이스를 수정하거나 속성을 추가 할 수없는 경우에 발생합니다. mapReduce를 사용할 수 있습니다. 예를 들어 :

db.getCollection('test').mapReduce(function() { 
     this.point = this.point || []; 
     this.point.forEach(function (point) { 
      point.wiFi = point.wiFi || []; 
      point.wiFi.forEach(function (wiFi) { 
       var rssid = parseInt(wiFi.rssid); 

       if (rssid >= -80 && rssid < -70) { 
        emit(point.nome, rssid); 
       } 
      }) 
     }); 
    }, 
    function (key) { 
     return key; 
    }, 
    {out: {inline: 1}} 
); 
+0

Antonio에게 감사드립니다. db에서 값을 String에서 Int로 변경하고 첫 번째 방법을 사용했습니다. 그것은 작동합니다. 다시 고마워요 – AlleBo

+0

@AlleBo 오신 것을 환영합니다! :) –

관련 문제