2016-09-15 1 views
2

In meinem Meteor Projekt, ich habe Dokumente wie folgt aus:Was ist ein richtiger Pub/Sub für die nächsten Dokumente, sortiert nach benutzerdefinierten Feldern?

{ 
    "_id" : "cgR25FAxb3tbYShjN", 
    "owner" : "6mQKnNnwkQYSaaAMr", 
    "username" : "admin", 
    "filename" : "5sQqwbDFBcZZ.png", 
    "title" : "Title", 
    "points" : 2, 
    "loc" : { 
     "type" : "Point", 
     "coordinates" : [ 
      -119.981134343, 
      20.635934343 
     ] 
    }, 
    "createdAt" : ISODate("2016-09-15T10:27:20.956Z") 
} 

ich in der Lage bin die nächsten Dokumente von dieser Abfrage zu finden:

Photos.find({loc: {$near: { $geometry: {type: "Point", coordinates: [lng, lat]}}}}); 

Was ich irgendwie zu tun in der Lage sein wollen, ist alles in der Nähe von Dokumenten von etwas wie points oder createdAt. Ich kann dies tun, wenn ich alle Dokumente gleichzeitig veröffentliche.

Das Problem:

Publishing 200+ Dokumente auf einmal im Geringsten nicht ideal. Ich möchte in der Lage sein, den Betrag, der an den Kunden zurückgegeben wird, zu begrenzen und mehr zu verlangen, wenn ich es brauche. Das Problem ist: wenn ich das mit einem einfachen {limit: 20} in der Abfrage mache, wird es wahrscheinlich ein Dokument geben, das ein wenig weiter weg ist, das mehr Punkte hat. Dies wird im Grunde die gesamte Sortierung vermasseln.

Ich überlegte, alle Dokumente auf dem Server sofort zu finden, dann 20 zu sortieren und wiederzugeben, aber wird das meinen Server nicht sehr belasten? Das Speichern von mehr als 200 Dokumenten im Speicher pro Benutzer scheint auch keine gute Idee zu sein.

Update:

Je mehr ich denke, das über desto mehr merke ich, dass es eine Voraussetzung ist zunächst eine große Abfrage auf dem Server zu tun, dann manuell die Daten an das Client übergeben. Selbst wenn ich eine $geoWithin nachschlagen würde, wenn ich den Pub auf 20 Dokumente beschränke, sind sie immer noch nicht in der richtigen Reihenfolge, wenn ich sie sortiere, weil sie zu unterschiedlichen Zeiten abgerufen werden.

Antwort

0

Sie müssen auch $minDistance oder $maxDistance zusammen mit der Abfrage angeben.

Photos.find({loc: {$near: { $geometry: {type: "Point", coordinates: [lng, lat]}},$maxDistance: 0.01}}); 

Die 0.01 in der Abfrage ist im Bogenmaß.

Siehe docs.

+0

Ist das eine Anforderung? Es funktioniert ohne es gut. Natürlich finde ich jedes Dokument in der Datenbank, aber das ist es, was ich will. Ich möchte es nicht besonders auf Distanz beschränken. Selbst dann löst das mein Problem nicht. – gkrizek

+0

was Sie tun, ist in diesem Fall ein Parameter an die Publikation in Bezug auf die Entfernung übergeben, wie es geändert wird. – Ankit

+0

Ich glaube, ich sehe nicht wirklich, wie das anders ist, als die Anzahl der Dokumente zu begrenzen. Wenn es einen Doc mit 2 Punkten in einer Entfernung von 0,5 Meilen und einen Doc mit 10 Punkten in einer Entfernung von 30 Meilen gibt, sind sie immer noch nicht in Ordnung, weil sie zu unterschiedlichen Zeiten abgeholt werden. – gkrizek

Verwandte Themen