MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Skip und Limit für Paginierung für ein Mongo-Aggregat

Ihr Problem liegt nicht bei skip() und limit(); das funktioniert prima. Das Problem liegt in Ihrer Gesamtlogik; Sie durchlaufen alle 39 Sammlungen in der ersten Schleife und hängen dann jedes Ergebnis der Aggregation an cursor_list an .

Ich kann die Logik dessen, was Sie versuchen, nicht verstehen, da das erste Beispiel in einer Wortsammlung sucht und das zweite in allen Sammlungen nach einem Wortfeld sucht. Nachdem dies gesagt wurde, können Sie Ihren Ansatz wahrscheinlich so vereinfachen:

offset = 0
per_page = 10
collections = db.list_collection_names()
#
# Add some logic on the collections array to filter what is needed 
#
print(collections[offset:offset+per_page])

BEARBEITEN, um Kommentare widerzuspiegeln. Vollständig ausgearbeitetes Beispiel einer Funktion, um dies auszuführen. Keine Aggregationsabfrage erforderlich – dies erhöht die Komplexität.

from pymongo import MongoClient
from random import randint

db = MongoClient()['testdatabase1']

# Set up some data
for i in range(39):
    coll_name = f'collection{i}'
    db[coll_name].delete_many({}) # Be careful; testing only; this deletes your data
    for k in range (randint(0, 2)):
        db[coll_name].insert_one({'word': '123456'})

# Main function
def test(offset, per_page, word_to_find):
    found = []
    collections = db.list_collection_names()
    for collection in sorted(collections):
        if db[collection].find_one({word_to_find: { '$exists': True}}) is not None:
            found.append(collection)

    print(found[offset:offset+per_page])

test(offset=0, per_page=10, word_to_find='word')