Řazení podle subjectID
Pokud vaše subjectID
je (nebo lze změnit na) monotónně rostoucí hodnotu (například výchozí ObjectID MongoDB), máte přímou možnost pomocí normálního find()
s vhodným řazením, přeskočením a limitem. V tomto případě můžete vyhledat dokumenty s předmětovými ID $gte
(větší než nebo rovno)
vaše subjectID
:
var page = 1;
var subjectID = ObjectId("515535a0760fe8735f5f6897");
db.users.find(
{ _id: { $gte : subjectID } }
).sort({'_id':1}).skip(page*20).limit(20)
Agregační rámec
Stejně jako v MongoDb 2.4 neexistuje žádná taková funkce v agregačním rámci, která by odpovídala na základě pozice dokumentu ve výsledkovém potrubí. Můžete podat návrh nové funkce SERVER projektu MongoDB Jira fronta.
Zní to, jako byste chtěli nový operátor kanálu, jako je $matchfrom
což by ignorovalo všechny dokumenty až do prvního výskytu $matchfrom
kritéria. Poté můžete přidat $limit
vzít dalších n položek. Také byste chtěli mít seřazený výstup před $matchfrom
takže je tu předvídatelný výsledek.
Zdá se to být příliš komplikované ve srovnání se zvyšujícím se ID subjektu, ale může existovat případ použití pro stránkování na základě pokročilejších kritérií vyhledávání nebo výsledků vypočítaných v agregačním kanálu.
Alternativní přístupy
Kromě budoucí podpory takové funkce v agregačním rámci máte několik možností, jak implementovat stejný přístup k porovnávání v kódu:
-
použijte starší
group()
agregační příkaz sfinalize()
funkce. POZNÁMKA:group()
ne pracovat s rozdělovanými shluky. -
použijte MapReduce a
finalize()
funkce -
načtěte celou sadu výsledků z agregačního rámce a implementujte porovnávání/redukci výsledků do kódu vaší aplikace (ačkoli to poněkud překonává představu „stránkování“, pokud načítáte všechny stránky pro každý požadavek).
Aspekty výkonu
Dotazy s skip
stále musíte číst mezilehlé položky rejstříku, takže přeskakování velkého počtu dokumentů nebude příliš efektivní.
Namísto stránkování s posunem přeskočení můžete zvážit provádění po sobě jdoucích dotazů na stránku tak, že začnete od poslední položky předchozí stránky (tj. první stránka bude $gte
počáteční předmět ID a následující stránky by byly $gt
poslední předmět ID na předchozí stránce). To bude záviset na tom, jak prezentujete stránkování ve svém uživatelském rozhraní – nejjednodušší by bylo použít tento přístup, pokud má vaše uživatelské rozhraní pouze možnost zobrazit „další“ stránku zpráv místo přechodu na konkrétní stránku.