web-dev-qa-db-fra.com

MongoDB - Inclure ou exclure certains éléments avec le pilote C #

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.

32
carlbenson

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();
39
Andrew Orsich

À 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();
29
i3arnon

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...
            }
        }
    }
1
clD

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

0