试图从一个布尔型字段的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();
}
}
}
}
答
而不是
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();
}
}
我不知道c#,但如果你在mongo shell中尝试相同的查询会发生什么? –
问题是MongoDB C#库在实体类型的东西中包装查询。 从命令行我可以这样做: db.UserProfiles.find({“Created”:{$ lt:ISODate(“2017-05-10”)}}))。pretty() 尽管没有游标(可能是Mongo使用游标实现搜索,但它对我来说是隐藏的) – MPG
这与Mongo命令行中的等价物相同: db.UserProfiles.find( { “Created”: { $ lt:ISODate(“2017-05-10”) } }) – MPG