如何创建搜索字段等于字符串或int

时间:2017-09-12 18:14:22

标签: mongodb mongodb-query mongodb-.net-driver

我有一个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进入查询吗?

1 个答案:

答案 0 :(得分:1)

正如我在上面的评论中所提到的,我建议您尝试以每个字段都具有可预测数据类型的方式“清理”您的数据。这使得处理起来容易得多......

尽管如此,您仍然可以使用基于字符串的版本:

var orFilter = builder.Or("{ \"userId\": 55 }", stringFilter);