Ho un numero di record utente (> 10000) in una raccolta MongoDB che può essere ordinato per punteggio desc + time asc + bonus desc. Come posso ottenere la classificazione di un utente nell'elenco secondo questo ordinamento usando Mongoose? Supponiamo che l'indice sia stato compilato correttamente.Come ottenere il posizionamento di un elemento nell'elenco ordinato per più campi in Mongola
risposta
Contare il numero di utenti che vengono prima di questo utente nel proprio ordinamento. Inizierò con il caso di un semplice (ordinamento non composto) perché la query nel caso composto è più complicata, anche se l'idea è esattamente la stessa.
> 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 }
per questo ordine, la classifica di un documento { "x" : i }
è il numero di documenti { "x" : j }
con 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
La classifica sarà basata a 0. Allo stesso modo, se si vuole calcolare il rango per il documento { "x" : i }
nel tipo { "x" : 1 }
, si conterebbe il numero di documenti { "x" : j }
con i > j
.
Per una sorta composto, la stessa procedura funziona, ma è più difficile da implementare perché l'ordine in un indice composto è lessicografico, cioè, per l'ordinamento { "a" : 1, "b" : 1}
, (a, b) < (c, d)
se a < c
o a = c
e b < d
, quindi abbiamo bisogno di una più query complicata per esprimere questa condizione. Ecco un esempio per un indice composto:
> 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 }
Per trovare il rango per il documento { "x" : i, "y" : j }
, è necessario trovare il numero di documenti { "x" : a, "y" : b }
nell'ordine { "x" : 1, "y" : -1 }
tale che (i, j) < (a, b)
. Data la specifica di riordino, questo è equivalente alla condizione i < a
o i = a
e 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
Infine, nel caso di un indice composto tre parti
{ "score" : -1, "time" : 1, "bonus" : -1 }
la funzione rank
sarebbe
> 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. Il modo più efficace per inserire un elemento nell'array ordinato e trovare il suo indice
- 2. Come ottenere l'indice ordinato di un vettore?
- 3. modo più rapido per determinare se un elemento si trova in un array ordinato
- 4. C# Elenco ordinato: come ottenere l'elemento successivo?
- 5. Ordina raccolta per più campi in Kotlin
- 6. Come ottenere un'aggregazione Elasticsearch con più campi
- 7. come ottenere indice di elementi array ordinato
- 8. Come trovare un indice in cui un nuovo elemento può essere inserito nell'elenco ordinato e tenerlo ordinato?
- 9. Come ottengo un elenco, ordinato per frequenza, in R
- 10. Ottenere le faccette ElasticSearch per il trattamento di contenuto di più campi come termine atomico
- 11. modo più veloce per ottenere unique() in MATLAB se si presume un vettore pre-ordinato 1d?
- 12. Come risolvere il posizionamento assoluto in IE8?
- 13. Come ottenere DIFF sul set ordinato
- 14. Ordinato in rosso su più di un criterio
- 15. Come ottenere il penultimo elemento in loop
- 16. Perché l'elaborazione di un array ordinato * più lento * rispetto a un array non ordinato? (Java's ArrayList.indexOf)
- 17. Python: come ottenere il numero ordinato di elementi in un elenco?
- 18. Come ottenere il innerText di un elemento con SimpleXml
- 19. Come inserisco un elemento nella posizione corretta in un array ordinato in Swift?
- 20. Esiste un contenitore ordinato in STL
- 21. Come controllare il posizionamento di jQueryUI datepicker
- 22. Ottenere un selettore jQuery per un elemento
- 23. Come posso ottenere il primo elemento in un NSDictionary?
- 24. Come ottenere il valore_attributo di un elemento page_object?
- 25. Come ottenere un elemento casuale in jquery?
- 26. Come ottenere solo un sottoinsieme di un hash ordinato in Ruby 1.9?
- 27. Come incrementare il valore di un set ordinato redis
- 28. Come disattivare il posizionamento relativo?
- 29. modo più efficace per trovare l'indice di un elemento in un SortedDictionary
- 30. Come visualizzare più valori di campi in un testo Campo