Ich habe eine Reihe von Benutzerdatensätzen (> 10000) in einer MongoDB-Sammlung, die nach Score desc + Zeit asc + Bonus desc sortiert werden kann. Wie kann ich das Ranking eines Benutzers in der Liste nach dieser Sortierung mit Mongoose erhalten? Angenommen, der Index wurde korrekt erstellt.Wie man Artikel-Ranking in Liste sortiert nach mehreren Feldern in Mongoose erhält
Antwort
Zählen Sie die Anzahl der Benutzer, die diesem Benutzer in Ihrer Sortierreihenfolge vorausgehen. Ich beginne mit dem Fall einer einfachen (nicht zusammengesetzten Sortierung), weil die Abfrage im zusammengesetzten Fall komplizierter ist, obwohl die Idee genau dieselbe ist.
> db.test.drop()
> for (var i = 0; i < 10; i++) db.test.insert({ "x" : i })
> db.test.find({ }, { "_id" : 0 }).sort({ "x" : -1 }).limit(5)
{ "x" : 9 }
{ "x" : 8 }
{ "x" : 7 }
{ "x" : 6 }
{ "x" : 5 }
Für diese Bestellung das Ranking eines Dokuments { "x" : i }
ist die Anzahl der Dokumente { "x" : j }
mit i < j
> var rank = function(id) {
var i = db.test.findOne({ "_id" : id }).x
return db.test.count({ "x" : { "$gt" : i } })
}
> var id = db.test.findOne({ "x" : 5 }).id
> rank(id)
4
Das Ranking auf 0 basieren wird Und falls Sie den Rang berechnen wollen das Dokument { "x" : i }
in der Sortierung { "x" : 1 }
, würden Sie die Anzahl der Dokumente { "x" : j }
mit i > j
zählen.
Für eine Verbindung Art arbeitet das gleiche Verfahren, aber es ist schwieriger zu implementieren, da die Reihenfolge, in einer Verbindung Index lexicographic ist, das heißt, für die Art { "a" : 1, "b" : 1}
, (a, b) < (c, d)
wenn a < c
oder a = c
und b < d
, so brauchen wir ein mehr komplizierte Abfrage, um diese Bedingung auszudrücken. Hier ist ein Beispiel für eine Verbindung Index:
> db.test.drop()
> for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
db.test.insert({ "x" : i, "y" : j })
}
}
> db.test.find({}, { "_id" : 0 }).sort({ "x" : 1, "y" : -1 })
{ "x" : 0, "y" : 2 }
{ "x" : 0, "y" : 1 }
{ "x" : 0, "y" : 0 }
{ "x" : 1, "y" : 2 }
{ "x" : 1, "y" : 1 }
{ "x" : 1, "y" : 0 }
{ "x" : 2, "y" : 2 }
{ "x" : 2, "y" : 1 }
{ "x" : 2, "y" : 0 }
Um den Rang für das Dokument zu finden { "x" : i, "y" : j }
, müssen Sie die Anzahl der Dokumente finden { "x" : a, "y" : b }
in der Reihenfolge { "x" : 1, "y" : -1 }
so dass (i, j) < (a, b)
. In Anbetracht der Art Spezifikation, ist dies gleichbedeutend mit der Bedingung i < a
oder i = a
und j > b
:
> var rank = function(id) {
var doc = db.test.findOne(id)
var i = doc.x
var j = doc.y
return db.test.count({
"$or" : [
{ "x" : { "$lt" : i } },
{ "x" : i, "y" : { "$gt" : j } }
]
})
}
> id = db.test.findOne({ "x" : 1, "y" : 1 })._id
> rank(id)
4
schließlich im Fall eines dreiteiligen Verbundindex
{ "score" : -1, "time" : 1, "bonus" : -1 }
die rank
Funktion wäre
> var rank = function(id) {
var doc = db.test.findOne(id)
var score = doc.score
var time = doc.time
var bonus = doc.bonus
return db.test.count({
"$or" : [
{ "score" : { "$gt" : score } },
{ "score" : score, "time" : { "$lt" : time } },
{ "score" : score, "time" : time, "bonus" : { "$gt" : bonus } }
]
})
}
- 1. mongoose-paginate sortiert nach Referenzdokument
- 2. Sortierung nach mehreren Feldern in SQLite
- 3. Wie man eine Liste nach Typ sortiert?
- 4. MySQL: Suche nach Duplikaten in mehreren Feldern
- 5. Sortieren nach mehreren Feldern in einer bestimmten Reihenfolge in Solr
- 6. Wie sortiert man einen Pandas DataFrame nach mehreren Kriterien?
- 7. Elasticsearch sortiert nach mehreren Feldnamen
- 8. DataTable - wie nach mehreren Spalten sortiert werden?
- 9. Sortieren nach mehreren Feldern mit Kriterien in Grails
- 10. Pflegen Sie eine Liste sortiert nach mehreren Attributen?
- 11. Wie man ein einzelnes Zeichen in mehreren Feldern in SQL
- 12. Python, wie man diese Liste sortiert?
- 13. SQLAlchemy: Wie man nach zwei Feldern gruppiert und nach Datum sortiert
- 14. SVN Liste nach Erstellungsdatum sortiert
- 15. Wie kann ich nach mehreren Feldern in LINQ sortieren? auch
- 16. Nach Datum sortiert in ASPxPivotGrid
- 17. Wie bekomme ich eine Liste, sortiert nach Häufigkeit, in R
- 18. JQ sortiert nach mehreren Schlüsseln absteigend
- 19. Wert in mehreren Feldern angepasst
- 20. Wie sortiere ich eine Liste in Scala nach zwei Feldern?
- 21. Grails sortableColumn mit mehreren Feldern
- 22. Wie spezifiziert man 2 Schlüssel in Python sortiert (Liste)?
- 23. LINQ-Gruppe nach mehreren Feldern -Syntax helfen
- 24. Sortierung einer Arraylist nach mehreren Feldern in Typescript
- 25. Wie wird ein Flex-Datagrid nach mehreren Spalten sortiert?
- 26. Wie Rückgabetypen mit mehreren Feldern
- 27. Kendo MultiSelect: Suche in mehreren Feldern
- 28. Liste sortiert nach Datum in absteigender Reihenfolge - groovy Wahnsinn
- 29. Speichern in mehreren versteckten Feldern in Sicht
- 30. Abrufen der Liste der Dateien sortiert nach Änderungsdatum in Perl