我有一个包含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驱动程序更好)?
答案 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)”
这是你想要的吗?