Solución:
En primer lugar, la diferencia básica entre findOne()
y find()
:
-
findOne()
– si la consulta coincide, se devuelve el primer documento; de lo contrario, es nulo. -
find()
– sin importar el número de documentos que coincidan, se devuelve un cursor, nunca nulo.
Entonces, cuando se pone en una condición if, findOne()
se puede convertir a falso cuando no coincide con ningún documento. Como find devuelve un objeto de cursor y nunca devuelve nulo, se convertirá en verdadero cuando se ponga en una condición if.
find
y findOne()
devuelve lo siguiente para una colección vacía:
La trampa en la que se encuentra es la conversión bastante indocumentada de objetos mongo shell a booleanos en javascript:
Encuentra uno() devuelve un documento, o nulo / nulo / como se llame
encontrar() devuelve un cursor, que puede estar vacío. Pero el objeto devuelto siempre está definido.
La la find()
el método devuelve un cursor
que es siempre truthy
incluso si los criterios de consulta no coinciden con ningún documento.
Por otro lado, el findOne
devuelve el primer documento que coincida con sus criterios de consulta o null
(JavaScript o el equivalente en su controlador de idioma) si no hay ningún documento que coincida con los criterios especificados.
> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
> var cursor = db.collection.find();
> cursor;
> typeof cursor;
object
> !cursor;
false
> var document = db.collection.findOne();
> document;
null
> typeof document;
object
> !document;
true