我正在使用C#MongoDb.Driver
(2.10)从集合中获取文档:
MongoClient dbClient = new
MongoClient("mongodb://***");
var dbList = dbClient.ListDatabases();
IMongoDatabase db = dbClient.GetDatabase("***");
var collList = db.ListCollections().ToList();
var collection = db.GetCollection<BsonDocument>("***");
Console.WriteLine( collection.Find(Builders<BsonDocument>.Filter.Empty).First());
这确实起作用并发出此消息:
所以一切都很好。
但是现在我想尝试过滤lockPolicyId.ToString()=="1"
的位置。(作为字符串,而不是数字)
所以我尝试了:
var filter= Builders<BsonDocument>.Filter.Where(a=>a["lockPolicyId"].AsString=="1");
var t=collection.Find( filter ).First() ;
Console.Writeline(t);
哪个显示此错误:
运算符'Equal'的操作数与以下参数不匹配方法“ op_Equality”。
我也尝试过:
var filter= Builders<BsonDocument>.Filter.Where(a=>a["lockPolicyId"].ToString()=="1");
并收到此错误:
{{document} {lockPolicyId} .ToString()不支持。
现在,我确实知道为什么会发生这种情况(整数而不是字符串)。
但仍然
问题:
如何通过ToString值进行过滤?
换句话说,使此行有效:
Builders<BsonDocument>.Filter.Where(a=>a["lockPolicyId"].AsString=="1")
[MongoDB C#驱动程序将a=>a["lockPolicyId"]==1
解释为{lockPolicyId: {"$eq" : "1"}}
。
[尝试使用a=>a["lockPolicyId"].AsString=="1"
时,无法将其解释为MongoDB语法...(此类查询{{$toString:"lockPolicyId"} : "1"}
无效)
MongoDB .find
方法具有$where
运算符的异常:
db.collection.find({"$where": "this.lockPolicyId.toString() == '1'"})
但是您需要手动编写这样的查询(不能通过Predicate
接口编写)。 注意:非常慢
MongoDB提供aggregate
命令来执行异常查询。您需要定义查询管道。如果您在第一阶段使用$toString
运算符,然后在第二阶段应用匹配条件,它将起作用:
db.collection.aggregate([
{$addFields:{
lockPolicyId : {$toString:"$lockPolicyId"}
}},
{$match:{
lockPolicyId : "1"
}}
])