13

これは非常に基本的なことのように思えるので、どこかでクラスまたはメソッドを見落としていると確信していますが、私の人生では、それを見つけることができません。

私は次のようなjson文字列を持っています:

{ SendId: 4, "Events.Code" : { $all : [2], $nin : [3] } }

これを mongo シェルで afind()または aに対して実行し、count()探しているものを取得できます。C# でこれを処理する最も簡単な方法は何ですか? これが私が見つけたものです:

  • 私が見つけているメソッドはすべて、IMongoQuery単なるマーカーインターフェイスである を望んでいます
  • BsonDocument素敵な Parse メソッドがありますが、実装されていませんIMongoQuery
  • QueryDocumentから継承しBsonDocument、実装していますが、独自の Parse メソッドがなく、にIMongoQuery変換できませんQueryDocumentBsonDocument
  • 集計フレームワークはBsonDocument[] を取りますが、単純な検索またはカウント操作が必要な場合もあります
  • Queryこれらのクエリの一部は大きくて粗末なものであり、ビルダー クラスを使用して一度に 1 行ずつ作成したくありません。

データベースが json ドキュメントを処理し、これをシェルで実行できる場合、ドライバーを介して実行する方法はありませんか?

4

2 に答える 2

17

BsonDocument醜いですが、文字列を にデシリアライズしてからでラップすることでこれを行うことができますQueryDocument

BsonDocument query = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>("{ SendId: 4, 'Events.Code' : { $all : [2], $nin : [3] } }");
QueryDocument queryDoc = new QueryDocument(query);
var result = collection.FindAs<TypeOfResultExpected>(queryDoc); // or just use Find

頻繁に行う予定がある場合は、いつでもメソッドでラップするかJSQueryDocument、次のようなクラスを作成できます。

public class JSQueryDocument : QueryDocument
{
    public JSQueryDocument(string query) : base(MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(query))
    {
        // Probably better to do this as a method rather than constructor as it
        // could be hard to debug queries that are not formatted correctly
    }
}

/// ...

var result = collection.Find(new JSQueryDocument("{ SendId: 4, 'Events.Code' : { $all : [2], $nin : [3] } }"));
于 2013-06-20T18:41:21.390 に答える