2017-06-15 6 views
0

MongoDBの新機能です。コレクションからデータを選択し、選択したセットをブール値フラグでフィルタリングしようとしています。私が経験している問題は、レコードが選択されていないということです。コードはC#で書かれており、MongoDB.Driver、.Bson、Driver.Coreライブラリを使用しています。ブール値フィールドでaMongoDBコレクションのフィルタリングを選択しようとしています

私はフォーラムやブログを読んだことがありますが、多くのことを試しましたが、何も期待された結果が得られないようです。誰かが光を放つことができるか、これを達成するためのよりよい方法を提案すれば、私は非常に感謝しています。コードはここに提示されています

public async Task ProcessFirstTimeBillers() 
    { 
     var userProfiles = _db.GetCollection<UserProfiles>("UserProfiles"); 

     var builder = Builders<UserProfiles>.Filter; 
     var filter = builder.Eq(x => x.FirstBillRequestSent, false); 

     using (var cursor = userProfiles.Find(filter.ToBsonDocument()).ToCursor()) 
     { 
      while (await cursor.MoveNextAsync()) 
      { 
       foreach (var doc in cursor.Current) 
       { 
        var jsonDoc = doc.ToJson(); 
        var s = jsonDoc.ToString(); 
       } 
      } 
     } 
    } 
+0

私はc#については考えていませんが、mongoシェルで同じクエリを実行するとどうなりますか? –

+0

問題は、MongoDB C#ライブラリがEntity型のものでクエリをラップすることです。 私は次のようなことができます: db.UserProfiles.find({"Created":{$ lt:ISODate( "2017-05-10")}})pretty() カーソルがなくても私が望むものは多分です(おそらくMongoはカーソルを使ってfindを実装していますが、私には隠されています) – MPG

+0

これはMongoのコマンドラインと同等です: db.UserProfiles.find( { "Created": { $ lt:ISODate( "2017-05-10") } } – MPG

答えて

0

代わりの

userProfiles.Find(filter.ToBsonDocument()) 

userProfiles.Find(filter) 

を書いて、それが動作するはずです。

ToBsonDocument()は、すべてのクラスマッピングとシリアライゼーション設定を考慮して、オブジェクトを取得してBson構造に変換する一般的な拡張メソッドです。それはFilterDefinitionタイプによって上書きないで、あなたのケースでのようないくつかのファンキーなフィルタを生産する効果的SimpleFilterDefinition`」の文字列値に「_t」フィールドを持っているすべてのドキュメントを検索するためにMongoDBを指示

{ "_t" : "SimpleFilterDefinition`2" } 

2 "あなたのデータベースにはないと推測します - >結果は得られません。

EDIT:

ここでは、作品の完全な例です。

public class UserProfiles 
{ 
    public ObjectId Id; 
    public bool FirstBillRequestSent; 
} 

public class Program 
{ 
    public static IMongoDatabase _db; 

    public static async Task ProcessFirstTimeBillers() 
    { 
     var userProfiles = _db.GetCollection<UserProfiles>("UserProfiles"); 

     var builder = Builders<UserProfiles>.Filter; 
     var filter = builder.Eq(x => x.FirstBillRequestSent, false); 

     using (var cursor = userProfiles.Find(filter).ToCursor()) 
     { 
      while (await cursor.MoveNextAsync()) 
      { 
       foreach (var doc in cursor.Current) 
       { 
        var jsonDoc = doc.ToJson(); 
        var s = jsonDoc.ToString(); 
        Console.WriteLine(s); 
        // prints something like: 
        // { "_id" : ObjectId("5944439d82d2e7265c86d50c"), "FirstBillRequestSent" : false } 
        // { "_id" : ObjectId("5944439d82d2e7265c86d50d"), "FirstBillRequestSent" : false } 
        // { "_id" : ObjectId("5944442b82d2e718d827d5d6"), "FirstBillRequestSent" : false } 
       } 
      } 
     } 
    } 

    static void Main(string[] args) 
    { 
     MongoClient client = new MongoClient(); 
     _db = client.GetDatabase("test"); 

     var collection = _db.GetCollection<UserProfiles>("UserProfiles"); 

     collection.InsertOne(new UserProfiles { FirstBillRequestSent = true }); 
     collection.InsertOne(new UserProfiles { FirstBillRequestSent = true }); 
     collection.InsertOne(new UserProfiles { FirstBillRequestSent = true }); 
     collection.InsertOne(new UserProfiles { FirstBillRequestSent = false }); 
     collection.InsertOne(new UserProfiles { FirstBillRequestSent = false }); 
     collection.InsertOne(new UserProfiles { FirstBillRequestSent = false }); 
     ProcessFirstTimeBillers().Wait(); 
     Console.ReadLine(); 
    } 
} 
+0

返信ありがとうございました。残念ながら、それは問題を解決していないようです。 – MPG

+0

私は単純に+ paste + runをコピーできる完全な例を追加しました。それは確かに私のマシンで動作します... – dnickless

+0

遅く返事申し訳ありません。すべてのあなたの返信をありがとう。彼らは私をすごく助け、私に期待される結果をもたらしました。 ただし、タイマーインターバルイベントでクエリを実行するWindowsサービスにコードを格納しているため、サービスの外部で実行されたときに同じコードが期待どおり実行されていても、行は返されません。 MongoDBがサービス内のWindowsタイマーイベント内で実行されないという不具合を知っている人はいますか? – MPG

関連する問題