Подтвердить что ты не робот

Mongodb - включать или исключать определенные элементы с помощью драйвера С#

Как я могу перевести этот запрос mongo в оператор Query.EQ в С#?

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

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

4b9b3361

Ответ 1

Обновление:. С новой версией драйвера (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();

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

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

Ответ 2

Начиная с версии 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();

Ответ 3

Обновление. Вы можете использовать проекцию и 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...
            }
        }
    }