2017-02-09 193 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", 
      } 
     ] 
} 

,我必須在PHP中,最大和最小以下rssid值一樣

min : -70 
max : - 80 

我想有一個查詢這給我值的列表這是我的兩個價值觀之間的調查。我不得不使用聚合查詢。

非常感謝你們。

+0

能否請你加出預期的JSON結果設置要查詢返回的例子嗎?這將有助於得到更準確的答案。 –

+0

你好,謝謝幫幫我。我想要有一個像[「大廳」,「restorant」]的列表。
這兩個值是rssid包含在默認值中的值,它們具有相同的ssid和自己的酒店支持。我希望能以最好的方式向你解釋。你可以幫幫我嗎? – AlleBo

+0

是否可以選擇更改數據庫並將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

非常感謝你安東尼奧。我在數據庫中將字符串的值更改爲Int,並使用第一種方法。這行得通。再次感謝您 – AlleBo

+0

@AlleBo歡迎您! :) –