繁体   English   中英

使用setFields和AsQueryable的Mongodb c#驱动程序FindAll

[英]Mongodb c# driver FindAll with setFields and AsQueryable

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

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#driver从mongo中获取所有文档,然后在内存中过滤它。 但我预计Where条件将转换为带字段的mongo查询。 任何人都可以解释如何正确地做到这一点?

您使用System.Linq .AsQueryable() ,因此它会过滤客户端的所有内容。 但是你需要使用MongoCollection .AsQueryable()来过滤数据库中的数据。 此扩展方法创建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完成。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM