【问题标题】:MongoDB Query<T>.Where(Expr) converts number Types to stringMongoDB Query<T>.Where(Expr) 将数字类型转换为字符串
【发布时间】:2016-03-31 18:49:59
【问题描述】:

我正在使用 MongoDB 查询对象将 C# 表达式 (Expression>) 转换为 JSON 查询对象,如下所示:

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);
}

但这也会产生一个字符串值...

【问题讨论】:

  • 是否可以升级您的 C# 驱动程序?
  • 我已经考虑过这一点,因为我使用的是旧版驱动程序的一部分。但较新的版本不提供 json 功能的表达式。
  • 实际上较新的位确实以几种不同的方式提供了此功能。请参阅下面的帖子。

标签: c# json mongodb linq


【解决方案1】:

我实际上测试了您更新的代码,它为以下两种用法生成了正确的 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】:

    如果你想记录C#驱动发送到服务器的查询,你可以修改MongoClientSettings

    但是,如果您只想提取 C# 生成的 JSON 查询,您可以使用 IFindFluent 来完成此操作

    var query = collection.Find(s => s.StudentId == 0);
    var jsonQuery = query.ToString();
    

    jsonQuery 将包含类似但取决于查询的内容。

    find({ "student_id" : 0 })
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        • 2019-01-05
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多