2016-07-25 9 views
0

Ich habe eine mobile App, die in der Nähe von Benutzern zeigen möchte. Alle 30 Sekunden möchte ich die Liste der Benutzer in der Nähe aktualisieren. In diesem Fall verwende ich für diese Funktion nicht die Meteor-Echtzeitsynchronisation, da ich denke, dass sie zu schwer ist. Ich denke, es ist besser, die Liste alle 30 Sekunden zu fragen.

Für jede User habe ich seine _id und seine mapPosition [lng, lat]. Meine Idee war, die Abfrage $near auf der Clientseite durchzuführen, da die Benutzerliste bereits mit dem Server synchronisiert sein sollte. Allerdings habe ich gelesen, dass Geo-Query auf der Clientseite von minimongo nicht unterstützt wird. Also habe ich eine neue Methode auf Serverseite erstellt. (Ich verwende immer noch keine Publish/Subscribe-Technik). Das Problem ist, dass ich es immer noch nicht funktioniert.

Beispiel Benutzer Dokument

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

Dies ist der Code auf meinem Server Seite

// 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();  
} 

dies den Code auf meinem Client ist Seite

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); 

Auf dem Server erhalte ich diese Fehler

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 

auf dem Client bekomme ich diese Fehler

[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) 

Antwort

0

ich den Ordner gelöst Löschen myAppDir/.meteor/local/db und Neustart Meteor