我正在使用MongoDB Query对象将C#表达式(Expression>)转换为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)被转换为字符串,而数据库字段是数字类型。因此,数据库不会返回任何对象......
我已经看过驱动程序源代码,并且常量表达式总是被解析为字符串:
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);
}
但那也产生了一个字符串值......
答案 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不能序列化小数...... :( 因此它从中发了一个字符串。