sql >> Databáze >  >> NoSQL >> MongoDB

Získejte index položky v dotazu mongodb

Ř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 s finalize() 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.




  1. Nelze se připojit k MongoDB Atlas (queryTxt ETIMEOUT)

  2. jak získat maximální hodnotu pole v MongoDB

  3. Mongoose:findOneAndUpdate neaktualizuje existující pole

  4. Operátor agregačního potrubí MongoDB $min