Проекция запроса с драйвером MongoDB 10gen - PullRequest
12 голосов
/ 22 августа 2011

Недавно я играл с официальным драйвером mongodb.Проблема, с которой я столкнулся, заключалась в том, как сделать проекцию запроса.Пример, если у меня есть постоянный объект

class A{
  id
  PropA
  PropB
  List<LargeObjects>
}

Как я могу получить только id, PropA и PropB вместо получения всего объекта?Как это сделать с помощью официального драйвера mongodb c #?

Ответы [ 6 ]

13 голосов
/ 23 августа 2011

Запрос проекции доступен через:

MongoCollection<>.Find().SetFields(include/exclude);
5 голосов
/ 17 мая 2013

Начиная с v1.8 официального драйвера 10gen MongoDB C # (и как Zambonilli исключен в предыдущем ответе) оператор Select linq всегда будет выполняться на стороне клиента, а не на сервере db.

Документация (также предоставлена ​​Сунил Раджем в предыдущем ответе): http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/

Практически на половине пути вниз под страницей под оператором запроса "Выбрать" находится большое красное поле со следующим текстом:

Предупреждение. Выбор не приводит к тому, что с сервера возвращается меньше полей. Весь документ извлекается и передается в собственный метод Select. Поэтому проекция выполняется на стороне клиента.

2 голосов
/ 16 августа 2012

Вы можете использовать следующий запрос linq для этого:

//NB: Not tested
    MongoCollection<BsonDocument> Acollection = _db.database.GetCollection<BsonDocument>("A");
    var resultlist = (from k in Acollection.AsQueryable<A>()
                                               select k.id,k.PropA,k.PropB);

Более подробную информацию о запросах linq можно найти здесь: http://www.mongodb.org/display/DOCS/CSharp+Driver+LINQ+Tutorial#CSharpDriverLINQTutorial-SupportedLINQqueryoperators

0 голосов
/ 19 февраля 2013

Используя профилировщик Mongo, я смог определить, что иногда результаты Linq проецируются на клиента.Поэтому это зависит от того, что нужно вашему клиенту.Если вы хотите вернуть полученный документ с частичными данными с сервера Mongo, вам нужно использовать ответы Марьян или Яна.В противном случае, если вы хотите прочитать запись и спроецировать ее на другой тип данных, используйте Linq.

0 голосов
/ 22 августа 2011

Используйте FindAs<> () с типом, который включает только те поля, которые вы хотите. См. документы .

Добавьте атрибут [BsonIgnoreExtraElements] или [BsonExtraElements] для этого класса. См. документы .

0 голосов
/ 22 августа 2011

Взгляните на FluentMongo:

https://github.com/craiggwilson/fluent-mongo/wiki/Linq

Доступно на Nuget aswell, поиск по запросу "fluentmongo"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...