Mongo parece estar devolviendo documentos duplicados para la misma consulta, es decir, devuelve más documentos que _id
únicos en los documentos devueltos:
lobby-brain> count_iterated = 0; ids = {} {} lobby-brain> db.the_collection.find({ 'a_boolean_key': true }).forEach((el) => { count_iterated += 1; ids[el._id] = (ids[el._id]||0) + 1; }) lobby-brain> count_iterated 278 lobby-brain> Object.keys(ids).length 251
Es decir, el número de _id únicos devueltos es 251, pero el cursor devolvió 278 documentos.
Investigando más:
lobby-brain> ids { '60cb8cb92c909a974a96a430': 1, '61114dea1a13c86146729f21': 1, '6111513a1a13c861467d3dcf': 1, ... '61114c491a13c861466d39cf': 2, '61114bcc1a13c861466b9f8e': 2, ... } lobby-brain> db.the_collection.find({ _id: ObjectId("61114c491a13c861466d39cf") }).forEach((el) => print("foo")); foo >
Es decir, en realidad no hay documentos duplicados con el mismo _id
; es solo un problema con .find()
.
Intenté reiniciar la base de datos y reconstruir un índice que involucraba 'a_boolean_key', con los mismos resultados.
Nunca había visto esto antes y parece imposible... ¿Qué está causando esto y cómo puedo solucionarlo?
Información de la versión:
Using MongoDB: 5.0.5 Using Mongosh: 1.0.4
Es una base de datos independiente, sin conjunto de réplicas ni fragmentación ni nada por el estilo.
Informacion adicional
Una cosa a tener en cuenta es que hay un índice compuesto con a_boolean_key como primer índice y un campo de fecha y hora como segundo. La clave booleana rara vez se actualiza en la base de datos (~una vez al día), pero el campo de fecha y hora se actualiza con frecuencia.
¿Quizás estas actualizaciones están causando los valores de retorno duplicados?
Actualización 15 de febrero de 2022: agregué una tarea de Mongo JIRA aquí .
Intente verificar si almacena índices para el campo a_boolean_key
.
Al realizar un
count
, MongoDB puede devolver el conteo usando solo el índice
Entonces, tal vez no tenga índices para todos los documentos, por lo que el resultado del método de count
no es igual a su conteo manual.
Según Louis Williams en Mongo JIRA , esto no es un error sino un comportamiento esperado.
¡Aprenda algo nuevo cada día!