MongoDB匹配查询构建

时间:2014-03-27 00:17:33

标签: mongodb mongodb-.net-driver bson mongo-collection

我的用户集合将包含这样的数据

{ name:"steve" }, { name:"david" }, { name:"sana" }, { name:"robert" }

我的查询就像这样

 var myCollections= _database.GetCollection<RawBsonArray>("users");
 var query = Query.Matches("name", "Steve Sam Steward Savior Sana");
 myCollections.Find(query);

以上查询将找到与“Steve Sam Steward Savior Sana”匹配的所有用户名但我希望任何用户名与“Steve Sam Steward Savior Sana”中的任何单词匹配

如何使上述查询反向工作

预期结果为{ name:"steve" },{ name:"sana" }

我做了ForEach循环,但我不确定这是否正确。

这就是我想要实现的目标

_users.Any(x => "Steve Sam Steward Savior Sana".ToLower().Contains(x.name.ToLower()));

2 个答案:

答案 0 :(得分:0)

我认为您需要的是$in运算符。虽然,我不熟悉C#,但这是如何在shell中完成的:

db.users.find({"name":{$in:["Steve", "Sam", "Steward", "Savior", "Sana"]}})

我希望这可以帮助你在C#中提出相应的内容。

答案 1 :(得分:0)

您可以使用:

var usernames = new List<string>() {@"Steve", @"Sam", @"Steward", @"Savior", @"Sana"};
// regex token list
var tokens = new List<string>();
for (var i = 0; i < usernames.Count; i++)
{
    // create the regex format
    var userRegex = string.Format("^{0}", usernames[i]);
    tokens.Add(userRegex);
}
var searchByUsernameRegex = string.Join(@"|", tokens);
Collection.Find(Query.Matches("Username", new BsonRegularExpression(searchByUsernameRegex))).ToList();

// regex token list
var tokens = new List<string>();
for (var i = 0; i < users.Count; i++)
{
    // create the regex format
    var userRegex = string.Format("^{0}", users[i]);
    tokens.Add(userRegex);
}
// create regex to match the usernames
var regexes = tokens.Select(x => new Regex(x)).ToList();
// construct the query
var usersQuery = Query.In("Username", new BsonArray(regexes));