MongoDB查询:如何检查存储在文档中的字符串是否包含在另一个字符串中

时间:2011-10-18 10:25:52

标签: mongodb mongodb-.net-driver

我有一个包含8k +字符串的集合,我需要检查特定字符串是否包含在另一个字符串中。例如:

StringInDb = "this is a string"
TheOtherString = "this is a long string that contains this is a string"

使用linq我使用了类似的东西:

from s in DB.Table 
where TheOtherString.IndexOf(s.StringInDb ) > -1
select s.StringInDb;

我如何(有效地)在mongodb中做到这一点(使用c#.net驱动程序更好)?

4 个答案:

答案 0 :(得分:4)

contains的mongodb中你需要使用regexp,所以c#查询将会跟随:

var query = Query.Matches("StringParamName", 
     BsonRegularExpression.Create(".*this is a string.*", "-i"));

完成查询构建后,将此查询放入Collection.FindAs<DocType>(query)方法。

-i - 表示忽略大小写

mongodb中的Regexp工作缓慢,因为它无法使用索引。但是对于8k的收集它应该很快。

答案 1 :(得分:2)

对我而言,这听起来像你需要使用map / reduce:从数据库中映射出所有字符串并减少到长字符串中包含的字符串。不记得我的头顶上的C#。如果你愿意,可以在以后找到它。

更新:MongoDB的本地语言是JavaScript,Map / Reduce在“mongodb引擎内”运行,这意味着map和reduce函数必须是JavaScript,而不是C#。它们可以从C#中调用,如本例所示,取自官方MogoDB C#驱动程序文档(http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-MapReducemethod)。该示例计算在集合中找到每个键的次数:

var map =
  "function() {" +
  "    for (var key in this) {" +
  "        emit(key, { count : 1 });" +
  "    }" +
  "}";

var reduce =
  "function(key, emits) {" +
  "    total = 0;" +
  "    for (var i in emits) {" +
  "        total += emits[i].count;" +
  "    }" +
  "    return { count : total };" +
  "}";

var mr = collection.MapReduce(map, reduce);
foreach (var document in mr.GetResults()) {
  Console.WriteLine(document.ToJson());
}

答案 2 :(得分:0)

这是我的生产系统中使用的包装器。当你应该总是调用GetBsonValue()并且它将为你做其余的工作

/// <summary>
/// Makes a Bson object for current value object
/// </summary>
/// <returns>The Bson object for current value object</returns>
private BsonValue GetBsonValue()
{
    if (!_value.Contains(_wildCard))
        return _value;
    string pattern = ApplyWildCard();
    return BsonRegularExpression.Create(new Regex(pattern, RegexOptions.IgnoreCase));
}

/// <summary>
/// Finds wildcard characters and substitutes them in the value  string
/// </summary>
/// <returns></returns>
private string ApplyWildCard()
{
    return string.Format("^{0}$", _value.Replace(_wildCard, ".*"));
}

从外面你打电话给下一个方法,所以你不可能忘记:

public QueryComplete BuildQuery()
    {
        return Query.EQ(_key, GetBsonValue());
    }

答案 3 :(得分:0)

"$where" : "\"

这是一个长字符串,其中包含一个字符串\“.match(this.YourFieldName)”

这是你想要的吗?