我有一个mongodb集合,其中userId字段有时是int,有时是字符串。 (55或" 55")
使用.NET驱动程序,我基于MongoDBLogEntry
类创建查询部分:
var filters = new List<FilterDefinition<MongoDBLogEntry>>();
foreach (var docFilter in docFilters)
{
var key = docFilter.Key; // Example: "userId"
var value = docFilter.Value; // Example: "55"
FilterDefinition<MongoDBLogEntry> filter;
if (key.EndsWith("Id"))
{
var intfilter = builder.Eq(key, BsonInt32.Create(Convert.ToInt32(value)));
var stringFilter = builder.Eq(key, value);
var orFilter = builder.Or(intfilter, stringFilter);
filter = orFilter;
}
else
{
filter = builder.Eq(docFilter.Key, value);
}
filters.Add(filter);
}
因为我的数据对某些字段有字符串或int,所以我的MongoDBLogEntry
类将userId字段定义为字符串,并在这些字段上使用StringOrIntSerializer : SerializerBase<string>
序列化程序。
我的问题是为其中一个id字段创建的查询是:
{ "$or" : [{ "userId" : "55" }, { "userId" : "55" }] }
我还尝试了一个$in
子句,它最终也是两个字符串值,"55", "55"
我想我理解为什么要将它们转换为字符串...因为我的MongoDBLogEntry
类定义了那个字段并将所有值转换为字符串。
但是我有办法使用上面的代码强制int
进入查询吗?
答案 0 :(得分:1)
正如我在上面的评论中所提到的,我建议您尝试以每个字段都具有可预测数据类型的方式“清理”您的数据。这使得处理起来容易得多......
尽管如此,您仍然可以使用基于字符串的版本:
var orFilter = builder.Or("{ \"userId\": 55 }", stringFilter);