2017-02-09 6 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値が設定されています私はこのデータベースを持っています私の2つの価値観の間に調査があります。

私は集約クエリを使用する必要があります。

ありがとうございます。

+0

は、あなたは、クエリが返すようにしたい設定予想されるJSONの結果を示す例を追加してくださいことはできますか?それはより正確な答えを得るのに役立ちます。 –

+0

こんにちは、助けてくれてありがとう。私は["hall"、 "restorant"]のようなリストを持っていたいと思います。
この2つの値は、デフォルト値に含まれるrssidの値であり、同じstruttureのssidとownを持ちます。私は最善の方法であなたに説明したかったのです。私たちを手伝ってくれますか? – AlleBo

+0

データベースを変更してrssidを文字列ではなく数字として保存することは可能ですか?または、追加の数値フィールドを持っていますか? –

答えて

1

問題ここでは、データベース内の文字列として格納されrssidsを持っており、モンゴの種類について厳格であるとして、あなたが数値でそれらを比較するために$ LTと$ GTEを適用することができないということです。

集約時に文字列を数値に変換する簡単な方法もありません。たとえば、$ where句は集計中には使用できません。

rssidをNumbersとして保持する(または元の文字列を保持し、追加の数値プロパティを持つ)ようにdatabseを変更してから、このような集約を実行するのが最初の方法です。

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'}} 
]) 

2番目の方法は、データベースを変更したりプロパティを追加したりできない場合に発生します。あなたは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

アントニオありがとうございました。 dbの値をStringからIntに変更し、最初のメソッドを使用しました。それは働く。もう一度ありがとうございます – AlleBo

+0

@AlleBoようこそ! :) –

関連する問題