Así que implementé infiniscroll con mongoose y mi consulta se ve así
const posts = await Seed.find({status: 'APPROVED', 'color.name': color}) .skip(parseInt(skip) || 0) .limit(8) .exec()Eso funciona muy bien, desde 0 hasta el final de las publicaciones. Sin embargo, si agrego .sort({votos a favor: -1})
const posts = await Seed.find({status: 'APPROVED', 'color.name': color}) .sort({upvotes: -1}) .skip(parseInt(skip) || 0) .limit(8) .exec()Todo se vuelve loco, puedo obtener la misma publicación 6 veces.
He mirado esto durante horas y simplemente no puedo entender por qué sucede esto y se siente como un error.
Probé .sort('-upvotes'), .sort({upvotes: 'desc'}), .sort({'upvotes': 'desc'})
Actualización: Ordenar por .sort('-date') realmente funciona, así que tengo un problema con los votos a favor específicamente. La mayoría de las publicaciones tiene 1 voto a favor. ¿La mangosta se aleatoriza entonces? Suena muy extraño si lo hizo
si alguien me puede ayudar a resolver esto se lo agradeceria mucho
Básicamente, su pregunta es similar a la paginación.
Debido a que sus múltiples documentos contienen el mismo valor de votos a upvotes , mongo no puede reconocer la diferencia (entre los mismos valores) y puede dar el mismo documento una y otra vez.
Por ejemplo, suponga que su limit es 2 y los siguientes son sus documentos.
[{ upvotes: 1, doc: "a" }, { upvotes: 2, doc: "b" }, { upvotes: 2, doc: "c" }, { upvotes: 3, doc: "d" }] Ahora, si usa sort con votos a upvotes: -1 y limit 2
Puede obtener en la primera página
[{ upvotes: 3, doc: "d" }, { upvotes: 2, // here mongo fails to make difference doc: "c" // document c }]o puede dar
[{ upvotes: 3, doc: "d" }, { upvotes: 2, // here mongo fails to make difference doc: "b" // document b }] Significa que mongo arroja aleatoriamente los documentos que tienen el mismo valor de campo de sort .
La solución es demasiado simple aquí, simplemente coloque _id consecuencia
const posts = await Seed.find({ status: 'APPROVED', 'color.name': color}) .sort({upvotes: -1, _id: -1 }) .skip(parseInt(skip) || 0) .limit(8) .exec()