Come faccio a sapere se ci sono altri risultati da una query in MongoDB?
Domanda
C'è un modo preferito di interrogazione mongo con un limite e sapere se ci saranno più risultati se interrogazione I per la pagina successiva con skip / limite?
Quello che ho fatto sta chiedendo di più un documento di cui ho bisogno, tagliando fuori alla fine, e con l'esistenza di tale documento in più per sapere se un'altra query darà più almeno un risultato.
n = 10
docs = db.documents.find({'foo': 'bar'}).limit(n+1)
more = docs.count() > n
docs = docs[:n]
Mi sento come questo è un caso d'uso comune (sapere se visualizzare o meno un pulsante "più risultati" su un sito web) e mi sento stupido con la mia soluzione attuale.
Soluzione
tailable cursori , che consentono di riutilizzare un cursore dopo tutti i dati sono stati restituiti. Sarebbe simile a questa:
n = 10
docs = db.documents.find({"foo": "bar"}).limit(n)
more = docs.hasNext()
Si noti che ci sono solo 10 documenti recuperati, ma il cursore possono essere ispezionati per determinare se ci sono più oggetti disponibili. L'unico problema è che i cursori tailable possono essere utilizzati solo su collezioni innevate.
La lattina sopra essere utilizzato anche con un cursore normale, ma che ci si deve interrogare per i documenti n + 1
. Questo è fondamentalmente la stessa soluzione che si sta utilizzando ora. Devi usare size()
anche se, come che prende i modificatori di salto e di limite in considerazione.
n = 10
docs = db.documents.find({"foo": "bar"}).limit(n + 1)
more = db.size() > n
Non ho familiarità con PyMongo, quindi non lo so per certo, ma c'è la possibilità che questa soluzione invia i documenti pieni n + 1
alla propria applicazione, piuttosto che il n
richiesta, con conseguente sovraccarico minore larghezza di banda. Se questo è il caso, si consiglia di creare una funzione lato server che fa la stessa cosa, ma restituisce solo un oggetto contenente documenti n
in un array, e un flag che indica se un documento n + 1
th è disponibili.