2016-07-25 136 views
0

我有一個移動應用程序,想要顯示附近的用戶。每30秒鐘,我想更新近用戶列表。在這種情況下,對於這個功能,我不使用Meteor實時同步,因爲我覺得它太重了。我認爲最好每30秒詢問清單。

對於每個User,我有他的_id和他的mapPosition [lng,lat]。 我的想法是在客戶端執行$near查詢,因爲用戶列表應該已經與服務器同步。不過,我讀了由minimongo在客戶端不支持地理查詢。所以我在服務器端創建了一個新的方法。 (我還沒有使用發佈/訂閱技術)。 問題是,我仍然沒有得到它的工作。

實施例文檔的 用戶

var user = 
    { _id  : "000000", 
    userName : "Daniele", 
    mapPosition : { type: "Point", 
        coordinates: [lng, lat] // float 
       } 
    } 

這是我的服務器

// collections.js 
Users  = new Mongo.Collection('users'); 
Users._ensureIndex({'mapPosition.coordinates':'2dsphere'}); 



// methods.js 
nearUsers(data){ 

     check(data, 
      { 
      mapPosition: [Number], // [lng, lat] 
      userId:String   // who is asking 
      }); 

     return Users.find({ 
          mapPosition: { $near: { $geometry: { type: "Point", 
                    coordinates: data.mapPosition 
                   }, 
                $maxDistance: 5 *1609.34 // 5 miles in meters 
                } 
              }, 
          '_id' : {$ne: data.userId} 
          } 
         ).fetch();  
} 

上的代碼,這是我的客戶側上的代碼

var getNearUsers = function() 
    { 
    var deferred = $q.defer(); 

    var mapPosition = [parseFloat(GeolocatorService.getAppPosition().lng), 
         parseFloat(GeolocatorService.getAppPosition().lat) 
         ]; 
    Meteor.call('nearUsers', 
       { 
        userId  : me.id, 
        mapPosition : mapPosition 
       }, 
       function (err, result) 
        { 
        if (err) 
         { 
         console.error('[getNearUsers] '+err); 
         deferred.reject(err); 
         } 
        else 
         { 
          console.log('[getNearUsers] '+JSON.stringify(result.fetch())); 
          deferred.resolve(result); 
         } 
        }); 
     return deferred.promise; 
} 

// call it each 30 seconds 
    setInterval (function() { getNearUsers(); }, 30000); 

在服務器上,我得到這個錯誤

Exception while invoking method 'nearUsers' MongoError: Unable to execute query: error processing que$ 
    at Object.Future.wait (/home/utente/.meteor/packages/meteor-tool/.1.3.2_2.x9uas0++os.linux.x86_32$ 
    at SynchronousCursor._nextObject (packages/mongo/mongo_driver.js:986:47) 
    at SynchronousCursor.forEach (packages/mongo/mongo_driver.js:1020:22) 
    at SynchronousCursor.map (packages/mongo/mongo_driver.js:1030:10) 
    at SynchronousCursor.fetch (packages/mongo/mongo_driver.js:1054:17) 
    at Cursor.(anonymous function) [as fetch] (packages/mongo/mongo_driver.js:869:44) 
    at [object Object].nearUsers (server/methods.js:38:47) 
    at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1704:12) 
    at packages/ddp-server/livedata_server.js:711:19 
    at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) 
    - - - - - 
Tree: $and 
    $not 
     _id == "570a6aae4bd648880834e621" 
    lastUpdate $gt 1469447224302.0 
    GEONEAR field=mapPosition maxdist=8046.7 isNearSphere=0 
Sort: {} 
Proj: {} 
planner returned error: unable to find index for $geoNear query 

在客戶端,我得到這個錯誤

[Error] Error: [filter:notarray] Expected array but received: {} 
http://errors.angularjs.org/1.4.3/filter/notarray?p0=%7B%7D 
http://localhost:8100/lib/ionic/js/ionic.bundle.js:13380:32 
http://localhost:8100/lib/ionic/js/ionic.bundle.js:31563:31 
fn 
[email protected]://localhost:8100/lib/ionic/js/ionic.bundle.js:27539:37 
[email protected]://localhost:8100/lib/ionic/js/ionic.bundle.js:28987:43 
[email protected]://localhost:8100/lib/ionic/js/ionic.bundle.js:29263:31 
[email protected]://localhost:8100/lib/ionic/js/ionic.bundle.js:24396:42 
    (funzione anonima) (ionic.bundle.js:25642) 
    (funzione anonima) (ionic.bundle.js:22421) 
    $digest (ionic.bundle.js:29013) 
    $apply (ionic.bundle.js:29263) 
    tick (ionic.bundle.js:24396) 

回答

0

我解決了刪除文件夾myAppDir/.meteor /本地/ db 並重新啓動流星