使用 MongoDB C# 驱动程序,似乎我无法通过 AsQueryable 使用 setFields 和 Where 条件仅通过 mongo 查询获取数据。我通过这段代码获取了文件

var query = _collection.FindAll().SetFields(fields.MongoFieldsBuilder).AsQueryable();
var query1 = query.Where(d=>d.Name="Ken").ToList();
var query2 = query.Where(d=>d.Age>=2).ToList();

因此,当 query1 或 query2 执行时,c# 驱动程序从 mongo 中获取所有文档,然后在内存中对其进行过滤。但我预计 Where 条件将转换为带有字段的 mongo 查询。
谁能解释一下如何正确地做到这一点?

最佳答案

您使用 .AsQueryable() 中的 System.Linq ,因此它会过滤客户端的所有内容。
但是您需要使用 .AsQueryable() 中的 MongoCollection 来过滤数据库中的数据。此扩展方法创建 MongoQueryable<T>

我相信以下应该有效:

//or you could use your projection class instead of BsonDocument
var query = Items.AsQueryable<BsonDocument>()
                 .Select(x=> new {id = x["_id"].AsObjectId, Name=x["Name"].AsString});
var query1 = query.Where(d=>d.Name == "Ken").ToList();

更新:

如果你想使用 SetFields 你必须使用旧的查询语法:
_col.Find(Query<UserDocument>.EQ(x=> x.Name, "Ken")).SetFields(..).

您也可以使用没有魔术字符串的 SetFields,如下所示:
cursor.SetFields(Fields<UserDocument>.Include(x=> x.Name, x=> x.Age))

使用 linq SetFields 是通过 Select 完成的。

希望这可以帮助。

关于c# - 带有 setFields 和 AsQueryable 的 Mongodb c# 驱动程序 FindAll,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13945974/

10-08 21:16