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)