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

Líné načítání/Více posouvání dat v Mongoose/Nodejs

Obecným konceptem "stránkování" je použití .skip() který v podstatě "přeskakuje" výsledky, které již byly načteny, takže můžete v podstatě udělat toto:

var q = Post.find().sort( "rating" ).skip(10).limit(10);

Ale opravdu, jak si dokážete představit, toto se značně zpomalí, když dostanete pár „stránek“. Takže opravdu chcete něco chytřejšího. V podstatě se jedná o "dotaz na rozsah", kde chcete získat vyšší (nebo nižší, pokud sestupně ) výsledky, než je poslední získaná sada výsledků. Takže vzhledem k poslední hodnotě 5 pak pro větší, než byste udělali:

var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);

Vypadá to dobře, ale pořád je tu problém. Co když další „stránka“ obsahuje také výsledky s hodnocením 5? Tento dotaz je přeskočí a nikdy je nezobrazí.

Chytrá věc, kterou musíte udělat, je „zachovat“ všechny _id hodnoty z dokumentu, protože se jedná o jedinečné klíče. Aplikujte v podstatě totéž, ale tentokrát se ujistěte, že do nové stránky nezahrnujete výsledky z předchozí stránky. $nin Zde pomůže operátor:

var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
    .sort( "rating" ).limit(10);

Zda seenIds je pouze poslední stránka výsledků nebo něco více závisí na "hustotě" hodnoty, podle které třídíte, a samozřejmě je musíte "uchovat" v proměnné relace nebo tak něco.

Ale zkuste to přizpůsobit, protože dotazy na rozsah jsou obvykle vaším nejlepším výsledkem.




  1. Vlastní prostředí Rails Resque.enqueue nevytváří úlohy

  2. Mongodb/Mongoid - co znamená {:multi => true}

  3. Cluster Failover

  4. MongoDB – agregační rámec (celkový počet)