J'écris une requête très, très simple qui obtient juste un document d'une collection selon son identifiant unique. Après quelques frustrations (je suis nouveau sur mongo et le modèle de programmation asynchrone/wait), j'ai compris ceci:
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;
Ça marche, super! Mais je continue de voir des références à une méthode "Find", et j'ai travaillé ceci:
IMongoCollection<TModel> collection = // ...
IFindFluent<TModel, TModel> findFluent = collection.Find(x => x.Id == id);
findFluent = findFluent.Limit(1);
TModel result = await findFluent.FirstOrDefaultAsync();
return result;
En fait, cela fonctionne aussi, super!
Je suis sûr qu'il y a une raison importante pour laquelle nous avons deux manières différentes d'obtenir ces résultats. Quelle est la différence entre ces méthodologies et pourquoi devrais-je choisir l'une plutôt que l'autre?
La différence réside dans une syntaxe. Find
et FindAsync
permettent tous deux de construire une requête asynchrone avec les mêmes performances, uniquement
FindAsync
renvoie curseur qui ne charge pas tous les documents à la fois et vous fournit une interface pour récupérer les documents un par un à partir du curseur DB. C'est utile dans le cas où le résultat de la requête est énorme.
Find
vous fournit syntaxe plus simple grâce à la méthode ToListAsync
où il récupère les documents à partir du curseur et retourne tous les documents à la fois.