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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top