MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Carregamento lento/mais rolagem de dados no Mongoose/Nodejs


O conceito geral de "paginação" é usar .skip() que essencialmente "pula" os resultados que já foram recuperados, então você pode fazer basicamente isso:
var q = Post.find().sort( "rating" ).skip(10).limit(10);

Mas realmente, como você pode imaginar, isso vai diminuir consideravelmente quando você colocar algumas "páginas". Então você realmente quer algo mais inteligente. Essencialmente, esta é uma "consulta de intervalo" na qual você deseja obter resultados mais altos (ou mais baixos, se descendente) do que o último conjunto de resultados recuperados. Então, dado o último valor de 5 então para maior do que você faria:
var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);

Parece Ok, mas realmente ainda há um problema. E se a próxima "página" também contiver resultados com uma classificação de 5? Essa consulta pularia esses e nunca os exibiria.

A coisa mais inteligente a fazer é "manter" todos os _id valores do documento, pois são chaves exclusivas. Basicamente aplique o mesmo tipo de coisa, exceto que desta vez você se certifica de não incluir os resultados da página anterior em sua nova. O $nin operador ajuda aqui:
var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
    .sort( "rating" ).limit(10);

Se os seenIds é apenas a última página de resultados ou um pouco mais depende da "densidade" do valor que você está classificando, e é claro que você precisa "manter" isso em uma variável de sessão ou algo assim.

Mas tente adaptar isso, pois as consultas de intervalo geralmente são o melhor resultado de desempenho.