试图从一个布尔型字段的MongoDB集合筛选中选择一个记录集

问题描述:

我对MongoDB非常陌生,我试图从一个集合中选择数据并通过布尔标志过滤所选集合。我遇到的问题是没有选择任何记录。代码用C#编写,并使用MongoDB.Driver,.Bson和Driver.Core库试图从一个布尔型字段的MongoDB集合筛选中选择一个记录集

我已经阅读论坛和博客,并尝试了很多东西,但似乎没有得到预期的结果。如果任何人可以摆脱任何光线或提出一个更好的方法来实现这一点,我会特别感激。该代码是这里介绍:

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 shell中尝试相同的查询会发生什么? –

+0

问题是MongoDB C#库在实体类型的东西中包装查询。 从命令行我可以这样做: db.UserProfiles.find({“Created”:{$ lt:ISODate(“2017-05-10”)}}))。pretty() 尽管没有游标(可能是Mongo使用游标实现搜索,但它对我来说是隐藏的) – MPG

+0

这与Mongo命令行中的等价物相同: db.UserProfiles.find( { “Created”: { $ lt:ISODate(“2017-05-10”) } }) – MPG

而不是

userProfiles.Find(filter.ToBsonDocument()) 

userProfiles.Find(filter) 

,它应该工作。

ToBsonDocument()是一种通用的扩展方法,它将采取任何对象并将其转换为一些Bson结构,同时考虑到所有类映射和序列化设置。这是由FilterDefinition类型覆盖,就会产生像一些时髦的过滤器,你的情况

{ "_t" : "SimpleFilterDefinition`2" } 

有效地指导MongoDB中搜索具有“_t”字段SimpleFilterDefinition`的”字符串值的任何文件2“,我认为你没有在你的数据库中 - >所以你没有结果。

编辑:

这里是工作的一个完整的例子。

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

感谢repy dnickless。不幸的是,它似乎并没有解决问题。 – MPG

+0

我添加了一个完整的例子,你应该能够简单地复制+粘贴+运行。它当然可以在我的机器上运行... – dnickless

+0

对不起,回复迟了。谢谢你的回复。他们imensely帮助我,并导致我获得预期的结果。 但是,由于我已经将代码放入了在定时器间隔事件中运行查询的Windows服务中,因此在服务之外运行时不会返回任何行,尽管运行的预期代码相同。 有没有人知道MongoDB中的任何缺陷,以防止它在服务中的Windows计时器事件中运行? – MPG