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

12

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

class A{
  id
  PropA
  PropB
  List<LargeObjects>
}

我该如何仅检索id、PropA和PropB,而不是整个对象?如何使用MongoDB官方C#驱动程序完成此操作?


1
Q.P 可以通过 MongoCollection<>.Find().SetFields(include/exclude) 方法进行访问。 - Marjan Nikolovski
在我看来,setfields 不是一个投影。它只是使文档中的值为空,因此您仍然拥有“完整的文档”,只是带有一些空值。 - Rasmus Christensen
6个回答

13

查询投影可通过以下方式实现:

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

5
截至正式的10gen MongoDB C#驱动v1.8版本(正如Zambonilli在之前的回答中所暗示的),Select linq操作符将始终在客户端上执行,而不是在数据库服务器上执行。
文档(Sunil Raj在之前的回答中也提供了):http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/ 在页面的中间位置下方,“Select” linq查询操作符下有一个大红色框,其中写着:
警告:Select不会导致从服务器返回更少的字段。整个文档被拉回并传递给本机Select方法。因此,投影是在客户端上执行的。

2

那时候还没有LINQ实现 :) - Marjan Nikolovski

0

通过Mongo分析器,我能够确定有时会在客户端上投影Linq结果。因此,这取决于您的客户端需求。如果您想从Mongo服务器返回部分数据的结果文档,则应使用Marjan或Ian的解答。否则,如果您要读取记录并将其投影到不同的数据类型,则使用Linq。


0

0

使用 FindAs<> () 方法并指定一个只包含所需字段的类型。请参阅文档

在该类上添加 [BsonIgnoreExtraElements][BsonExtraElements] 属性。请参阅文档


基本上,结果表明调用集合中的read来设置字段就足以使q.p成立。 - Marjan Nikolovski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接