如何创建搜索字段等于字符串或整数的查询
How to create query that searches for field equals string or int
我有一个 mongodb 集合,其中 userId 字段有时是一个整数,有时是一个字符串。 (55 或“55”)
使用 .NET 驱动程序,我根据 MongoDBLogEntry
class:
创建查询部分
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);
}
因为我的数据的某些字段有字符串或整数,所以我的 MongoDBLogEntry
class 将 userId 字段定义为字符串,并在这些字段上使用 StringOrIntSerializer : SerializerBase<string>
序列化程序。
我的问题是为其中一个 ID 字段创建的查询是:
{ "$or" : [{ "userId" : "55" }, { "userId" : "55" }] }
我还尝试了一个 $in
子句,它最终也是两个字符串值,"55", "55"
我 认为 我理解为什么将它们转换为字符串...因为我的 MongoDBLogEntry
class 以这种方式定义字段并转换所有值到一个字符串。
但是我有办法用上面的代码强制 int
进入查询吗?
正如我在上面的评论中提到的,我建议您尝试 "clean up" 您的数据,使每个字段都具有可预测的数据类型。这使得处理起来容易得多...
尽管如此,您始终可以求助于使用基于字符串的版本:
var orFilter = builder.Or("{ \"userId\": 55 }", stringFilter);
我有一个 mongodb 集合,其中 userId 字段有时是一个整数,有时是一个字符串。 (55 或“55”)
使用 .NET 驱动程序,我根据 MongoDBLogEntry
class:
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);
}
因为我的数据的某些字段有字符串或整数,所以我的 MongoDBLogEntry
class 将 userId 字段定义为字符串,并在这些字段上使用 StringOrIntSerializer : SerializerBase<string>
序列化程序。
我的问题是为其中一个 ID 字段创建的查询是:
{ "$or" : [{ "userId" : "55" }, { "userId" : "55" }] }
我还尝试了一个 $in
子句,它最终也是两个字符串值,"55", "55"
我 认为 我理解为什么将它们转换为字符串...因为我的 MongoDBLogEntry
class 以这种方式定义字段并转换所有值到一个字符串。
但是我有办法用上面的代码强制 int
进入查询吗?
正如我在上面的评论中提到的,我建议您尝试 "clean up" 您的数据,使每个字段都具有可预测的数据类型。这使得处理起来容易得多...
尽管如此,您始终可以求助于使用基于字符串的版本:
var orFilter = builder.Or("{ \"userId\": 55 }", stringFilter);