MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Chargement paresseux/défilement de données supplémentaires dans Mongoose/Nodejs

Le concept général de "pagination" consiste à utiliser .skip() qui "ignore" essentiellement les résultats qui ont déjà été récupérés, vous pouvez donc faire ceci :

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

Mais vraiment, comme vous pouvez l'imaginer, cela va ralentir considérablement lorsque vous obtenez quelques "pages". Vous voulez donc vraiment quelque chose de plus intelligent. Il s'agit essentiellement d'une "requête de plage" dans laquelle vous souhaitez obtenir des résultats supérieurs (ou inférieurs si descendants) au dernier ensemble de résultats récupérés. Donc étant donné la dernière valeur de 5 alors pour plus que vous ne le feriez :

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

Ça a l'air d'être bon, mais il y a toujours un problème. Et si la "page" suivante contenait également des résultats avec une note de 5 ? Cette requête les ignorerait et ne les afficherait jamais.

La chose intelligente à faire est de "conserver" tous les _id valeurs du document puisqu'il s'agit de clés uniques. Appliquez essentiellement le même genre de chose, sauf que cette fois vous vous assurez de ne pas inclure les résultats de la page précédente dans votre nouvelle. Le $nin l'opérateur aide ici :

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

Si les seenIds n'est que la dernière page de résultats ou un peu plus dépend de la "densité" de la valeur sur laquelle vous triez, et bien sûr vous devez les "conserver" dans une variable de session ou quelque chose comme ça.

Mais essayez d'adapter cela, car les requêtes de plage sont généralement votre meilleur résultat de performance.