【问题标题】:How to create query that searches for field equals string or int如何创建搜索字段等于字符串或整数的查询
【发布时间】:2017-09-12 18:14:22
【问题描述】:

我有一个 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&lt;string&gt; 序列化程序。

我的问题是为 id 字段之一创建的查询是:

{ "$or" : [{ "userId" : "55" }, { "userId" : "55" }] }

我还尝试了$in 子句,它最终也是两个字符串值"55", "55"

认为我明白为什么将它们转换为字符串...因为我的MongoDBLogEntry 类以这种方式定义字段并将所有值转换为字符串。

但是有没有办法让我使用上面的代码将int 强制加入查询中?

【问题讨论】:

  • 我想我知道答案,但是......你能不能改变你的数据模型来正确输入任何给定字段的字符串或整数数据?

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


【解决方案1】:

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

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

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

【讨论】:

  • 我的应用程序不插入字符串而不是整数是理想的,但我无法立即修复遗留错误。不断轮询和修复数据库不是我想做的事情。因此,为了立即完成这项工作,我需要使用您建议的解决方案,效果很好。
猜你喜欢
  • 2015-02-05
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多