Mongodb - включить или исключить определенные элементы с драйвером c # - PullRequest
31 голосов
/ 09 декабря 2011

Как бы я перевел этот монго запрос в оператор Query.EQ в C #?

db.users.find({name: 'Bob'}, {'_id': 1});

Другими словами, я не хочу, чтобы все возвращалось в C # - только один элемент, который мне нужен, _id. Как всегда, учебник по Mongo C # Driver не помогает.

Ответы [ 4 ]

39 голосов
/ 09 декабря 2011

Обновление: В новой версии драйвера (1.6+) вы можете избежать жесткого кодирования имен полей, используя вместо этого linq:

var users = usersCollection.FindAllAs<T>()
                           .SetFields(Fields<T>.Include(e => e.Id, e => e.Name));

Вы можете сделать это с помощью SetFields метод курсора mongodb:

var users = usersCollection.FindAllAs<T>()
                 .SetFields("_id") // include only _id
                 .ToList();

По умолчанию SetFields включает указанные поля.Если вам нужно исключить определенные поля, вы можете использовать:

var users = usersCollection.FindAllAs<T>()
                 .SetFields(Fields.Exclude("_id")) // exclude _id field
                 .ToList();

Или вы можете использовать их вместе:

var users = usersCollection.FindAllAs<T>()
                 .SetFields(Fields.Exclude("_id")   // exclude _id field
                                  .Include("name")) // include name field
                 .ToList();
29 голосов
/ 18 мая 2015

Начиная с версии 2.0 драйвера есть новый только асинхронный API. Старый API больше не следует использовать, поскольку он блокирует фасад нового API и устарел.

Рекомендованный в настоящее время способ включить или исключить определенных членов - это использовать метод Project для IFindFluent, полученного из Find.

Вы можете передать лямбда-выражение:

var result = await collection.Find(query).Project(hamster => hamster.Id).ToListAsync();

Или используйте построитель проекций:

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();
1 голос
/ 24 мая 2017

Обновление Вы можете использовать проекцию и FindAsync, который возвращает курсор и не загружает все документы одновременно, в отличие от Find.Вы также можете установить порядок сортировки и ограничение количества возвращаемых документов.

    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...
            }
        }
    }
0 голосов
/ 23 мая 2019

вот простой способ получить id, как вам нужно:

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();            
        }
    }
}

Обратите внимание: в приведенном выше коде используется библиотека-оболочка mongodb с именем MongoDB.Entities

...