c# - Diferencia entre Find y FindAsync
mongodb mongodb-query (2)
Imagine que ejecuta este código en una solicitud web, con el método de búsqueda de invocación, el hilo de la solicitud se congelará hasta que la base de datos devuelva resultados, es una llamada sincrónica. Si es una operación de base de datos larga que tarda unos segundos en completarse, tendrá una de los subprocesos disponibles para atender la solicitud web no hacen nada, simplemente esperan a que la base de datos devuelva los resultados y desperdicien recursos valiosos (el número de subprocesos en el conjunto de subprocesos es limitado).
Con FindAsync, el subproceso de su solicitud web será libre mientras espera la base de datos para devolver los resultados, esto significa que durante la llamada a la base de datos este subproceso puede asistir a otra solicitud web. Cuando la base de datos devuelve el resultado, el código continúa su ejecución.
Para operaciones largas como lectura / escritura desde el sistema de archivos, operaciones de base de datos, comunicación con otros servicios, es una buena idea usar llamadas asíncronas. Porque mientras espera los resultados, los subprocesos están disponibles para servir otra solicitud web. Esto es más escalable.
Eche un vistazo a este artículo de microsoft https://msdn.microsoft.com/en-us/magazine/dn802603.aspx .
Estoy escribiendo una consulta muy, muy simple que solo obtiene un documento de una colección de acuerdo con su identificación única. Después de algunas frustraciones (soy nuevo en mongo y el modelo de programación async / await), me di cuenta de esto
IMongoCollection<TModel> collection = // ...
FindOptions<TModel> options = new FindOptions<TModel> { Limit = 1 };
IAsyncCursor<TModel> task = await collection.FindAsync(x => x.Id.Equals(id), options);
List<TModel> list = await task.ToListAsync();
TModel result = list.FirstOrDefault();
return result;
¡Funciona, genial! Pero sigo viendo referencias a un método "Buscar", y resolví esto:
IMongoCollection<TModel> collection = // ...
IFindFluent<TModel, TModel> findFluent = collection.Find(x => x.Id == id);
findFluent = findFluent.Limit(1);
TModel result = await findFluent.FirstOrDefaultAsync();
return result;
Como resultado, esto también funciona, ¡genial!
Estoy seguro de que hay una razón importante por la que tenemos dos formas diferentes de lograr estos resultados. ¿Cuál es la diferencia entre estas metodologías y por qué debo elegir una sobre la otra?
La diferencia está en una sintaxis. Find
y FindAsync
permiten crear consultas asíncronas con el mismo rendimiento, solo
FindAsync
devuelve el cursor que no carga todos los documentos a la vez y le proporciona una interfaz para recuperar los documentos uno por uno desde el cursor DB. Es útil en caso de que el resultado de la consulta sea enorme.
Find
proporciona una sintaxis más simple a través del método ToListAsync
donde recupera documentos desde el cursor y devuelve todos los documentos a la vez .