sql >> Databasteknik >  >> NoSQL >> MongoDB

Hoppa över och begränsa för sidnumrering för ett Mongo-aggregat

Ditt problem är inte med skip() och limit(); det fungerar bra. Problemet är din övergripande logik; du itererar alla 39 samlingarna i den första slingan och lägger sedan till varje resultat av aggregeringen till cursor_list .

Jag kan inte lista ut logiken i det du försöker göra, eftersom det första exemplet är att leta i en ordsamling och det andra är att leta i alla samlingar efter ett ordfält; med det sagt kan du förmodligen förenkla din inställning till något som:

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])

EDIT för att återspegla kommentarer. Fullständigt fungerande exempel på en funktion för att utföra detta. Inget behov av en aggregeringsfråga - detta ökar komplexiteten.

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')



  1. MongoDB:infoga dokument med specifikt id istället för autogenererat ObjectID

  2. mongodb sparar inte all data

  3. Mongodb skapar alias i en fråga

  4. Det går inte att hämta data från API med Express NodeJS och MongoDB, laddar