使用MongoDB 10gen驱动程序查询投影

本文关键字:查询 投影 驱动程序 10gen MongoDB 使用 | 更新日期: 2023-09-27 18:06:21

最近我正在玩mongodb官方驱动程序。我遇到的问题是如何使查询投影。例如,如果我有一个持久化对象

class A{
  id
  PropA
  PropB
  List<LargeObjects>
}

我怎么能只检索id, PropA和prob,而不是检索整个对象?如何使用mongodb官方c#驱动程序?

使用MongoDB 10gen驱动程序查询投影

查询投影可通过:

MongoCollection<>.Find().SetFields(include/exclude);

作为官方10gen MongoDB c#驱动程序的v1.8,(并且正如Zambonilli在之前的回答中回避的那样)Select linq操作符将始终在客户端执行,而不是在db服务器上。

文档(也由Sunil Raj在之前的回答中提供):http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/

几乎在页面的中间,在"选择"linq查询操作符的下方,有一个红色的大框,上面写着:

警告:选择不会导致从服务器返回更少的字段。整个文档被拉回并传递给本机Select方法。因此,投影在客户端执行。

您可以使用下面的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 +司机+ LINQ +教程# CSharpDriverLINQTutorial-SupportedLINQqueryoperators

看看FluentMongo:

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

在Nuget上也有,搜索"fluentmongo"

使用仅包含所需字段的类型FindAs<>()。看到文档。

在该类上添加[BsonIgnoreExtraElements][BsonExtraElements]属性。看到文档。

使用Mongo分析器,我能够确定有时Linq结果会投影到客户机上。因此,这取决于你的客户需要什么。如果您希望返回一个结果文档,其中包含来自Mongo服务器的部分数据,那么您将需要使用Marjan或Ian的答案。否则,如果您想读取记录并将其投影到不同的数据类型,则使用Linq.