Mongodb - включать или исключать определенные элементы с помощью драйвера С#
Как я могу перевести этот запрос mongo в оператор Query.EQ в С#?
db.users.find({name: 'Bob'}, {'_id': 1});
Другими словами, я не хочу, чтобы все возвращалось на С#. Только один элемент, который мне нужен, _id. Как всегда, руководство пользователя Mongo С# не помогает.
Ответы
Ответ 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...
}
}
}