Comment puis-je traduire cette requête de Mongo en une instruction Query.EQ en C #?
db.users.find({name: 'Bob'}, {'_id': 1});
En d'autres termes, je ne veux pas que tout soit retourné sur C # - juste l'élément dont j'ai besoin, le _ID. Comme toujours, le tutoriel de pilote de Mongo C # n'est pas utile.
Mise à jour : avec la nouvelle version du pilote (1.6+) Vous pouvez éviter les noms de champs de champs en utilisant Linq à la place:
var users = usersCollection.FindAllAs<T>()
.SetFields(Fields<T>.Include(e => e.Id, e => e.Name));
Vous pouvez le faire via SetFields
méthode de curseur Mongodb:
var users = usersCollection.FindAllAs<T>()
.SetFields("_id") // include only _id
.ToList();
Par défaut SetFields
inclut les champs spécifiés. Si vous avez besoin d'exclure certains domaines, vous pouvez utiliser:
var users = usersCollection.FindAllAs<T>()
.SetFields(Fields.Exclude("_id")) // exclude _id field
.ToList();
Ou vous pouvez les utiliser ensemble:
var users = usersCollection.FindAllAs<T>()
.SetFields(Fields.Exclude("_id") // exclude _id field
.Include("name")) // include name field
.ToList();
À partir de V2.0 du pilote, il y a une nouvelle API ASYNC uniquement. L'ancienne API ne devrait plus être utilisée car il s'agit d'une façade bloquante sur la nouvelle API et est obsolète.
La voie actuellement recommandée d'inclure ou d'exclure certains membres consiste à utiliser la méthode Project
sur le IFindFluent
vous obtenez de Find
.
Vous pouvez soit passer une expression Lambda:
var result = await collection.Find(query).Project(hamster => hamster.Id).ToListAsync();
Ou utilisez le constructeur de projection:
var result = await collection.Find(query)
.Project<Hamster>(Builders<Hamster>.Projection.Include(hamster => hamster.Id))
.ToListAsync();
var result = await collection.Find(query)
.Project<Hamster>(Builders<Hamster>.Projection.Exclude(hamster => hamster.FirstName).
Exclude(hamster => hamster.LastName))
.ToListAsync();
Mise à jour Vous pouvez utiliser une projection et FindAsync
qui renvoie un curseur et ne charge pas tous les documents à la fois contrairement à Find
. Vous pouvez également définir un ordre de tri et limiter le nombre de documents retournés.
var findOptions = new FindOptions<BsonDocument>();
findOptions.Projection = "{'_id': 1}";
// Other options
findOptions.Sort = Builders<BsonDocument>.Sort.Ascending("name");
findOptions.Limit = int.MaxValue;
var collection = context.MongoDatabase.GetCollection<BsonDocument>("yourcollection");
using (var cursor = collection.FindSync("{name : 'Bob'}", options))
{
while (cursor.MoveNext())
{
var batch = cursor.Current;
foreach (BsonDocument document in batch)
{
// do stuff...
}
}
}
voici un moyen simple de récupérer uniquement le id
comme vous avez besoin:
using MongoDB.Driver.Linq;
using MongoDB.Entities;
using System.Linq;
namespace StackOverflow
{
public class User : Entity
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
new DB("test");
(new User { Name = "Bob" }).Save();
var id = DB.Collection<User>()
.Where(u => u.Name == "Bob")
.Select(u => u.ID)
.First();
}
}
}
mind You, le code ci-dessus utilise la bibliothèque de Wrapper Mongodb appelée MongoDb.ententies