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()