MongoDB查询<t> .Where(Expr)将数字类型转换为字符串

时间:2016-03-29 11:23:01

标签: c# json mongodb linq

我正在使用MongoDB Query对象将C#表达式(Expression&gt;)转换为JSON Query对象,如下所示:

class TestObj
{
    public string Name { get; set; }
    public Int32 Age { get; set; }
}

public void TestQueryMethod()
{
    var mongoquery = Query<TestObj>.Where(to => to.Age > 20);
    var queryjson  = mongoquery.ToJson(); // -> { "age" : { "$gt" : "20" }}
}

我想将此JSON查询字符串发送到我的后端,后端会将字符串解析为mongoquery(效果很好)。问题是常量“age”(20)被转换为字符串,而数据库字段是数字类型。因此,数据库不会返回任何对象......

我已经看过驱动程序源代码,并且常量表达式总是被解析为字符串:

来自:https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver.Legacy/Linq/Expressions/ExpressionFormatter.cs

 private void VisitValue(object value)
 {
     // [..]
     _sb.Append(value.ToString());
 }

更新: 由于我无法访问前端中的数据库集合(前端只发送json查询),因此该解决方案无效。我尝试使用Builders类:

var query = Builders<T>.Filter.Where(iCompareCriteria).RenderToBsonDocument().ToJson();

public static BsonDocument RenderToBsonDocument<T>(this FilterDefinition<T> filter)
{
    var serializerRegistry = BsonSerializer.SerializerRegistry;
    var documentSerializer = serializerRegistry.GetSerializer<T>();
    return filter.Render(documentSerializer, serializerRegistry);
}

但那也产生了一个字符串值......

3 个答案:

答案 0 :(得分:0)

如果要记录C#驱动程序发送给服务器的查询,可以修改MongoClientSettings

但是,如果您只想提取C#正在生成的JSON查询,则可以使用IFindFluent

执行此操作
var query = collection.Find(s => s.StudentId == 0);
var jsonQuery = query.ToString();

jsonQuery将包含类似但依赖于查询的内容。

find({ "student_id" : 0 })

答案 1 :(得分:0)

我实际测试了您更新的代码,并为以下两种用法生成了正确的json值。

var filter1 = Builders<TestObj>.Filter.Gt(t => t.Age, 20);
var json1 = filter1.RenderToBsonDocument().ToJson();
// Result: { "Age" : { "$gt" : 20 } }

var filter2 = Builders<TestObj>.Filter.Where(t => t.Age > 20);
var json2 = filter2.RenderToBsonDocument().ToJson();
// Result: { "Age" : { "$gt" : 20 } }

我使用的是MongoDB C#驱动程序版本2.2.3.3。

答案 2 :(得分:0)

好的,问题是我正在与小数类型进行比较。然后变量从一个整数转换为十进制类型var,因为我们都知道mongodb不能序列化小数...... :( 因此它从中发了一个字符串。