2016-03-29 10 views
1

に番号の種類を変換し、ここで見られるようなオブジェクト:私はしたいMongoDBのクエリ<T> .Where(exprが)私はJSONクエリにC#の式(式>)に変換するためにMongoDBのクエリオブジェクトを使用している文字列

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クエリ文字列を私のバックエンドに送ってください。このJSONクエリ文字列をmongoqueryに解析します(これはうまくいきます)。問題は定数 "年齢"(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クエリのみを送信します)、この解決策は機能しません。私は、ビルダークラスを使用してみました:

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

C#ドライバをアップグレードすることは可能ですか? ? – Saleem

+0

レガシードライバの一部を使用しているので、私はすでに考えていましたが、新しいビルドではjsonの機能に表現が提供されていません。 – gabs

+0

実際には新しいビットは、この機能を複数の方法で提供します。 – Saleem

答えて

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を使用しています。

0

を使用すると、C#のドライバがサーバーに送信クエリをログに記録する場合は、MongoClientSettings

を変更することができますしかし、あなたはC#が発生しているものを単に抽出JSONクエリをしたい場合、あなたはIFindFluent

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

jsonQueryがsomethiが含まれますを使用して行うことができます好きですが、クエリに依存します。

find({ "student_id" : 0 }) 
0

[OK]問題は、私は小数点型と比較していました。変数は整数から小数点以下の型varにキャストされ、私たちすべてがmongodbが小数点以下をシリアル化できないことを知っています... :( したがって、それから文字列を作成しました

関連する問題