2014-03-27 2 views
0

моих пользователи коллекция будет иметь данные, как этогоMongoDB Спичка построения запросов

{ 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 Спаситель Sana ". Но я хочу, чтобы любое имя пользователя совпадает с любым словом в «Стив Сэм Steward Спаса Сана»

Как я могу сделать выше работы запроса в обратном

Ожидаемый результат { name:"steve" },{ name:"sana" }

Я пошел делая цикл ForEach, но я не уверен, что это правильный путь.

Это то, что я пытаюсь достичь

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

вы не должны делать в разделе? –

ответ

0

Я думаю, что вам нужно, это $in оператор. Хотя, я не знаком с C#, это то, как это может быть сделано в оболочке:

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

Я надеюсь, что это поможет вам придумать эквивалент в C#.

+0

Nope. Здесь Стив Сэм стюард .... Все это единственная строка – HaBo

+0

Я не думаю, что это модно в MongoDB. Не можете ли вы использовать метод String для разделения/tokenize строки в вашей клиентской программе? Я просто googled и нашел [это] (http://msdn.microsoft.com/en-us/library/system.string.split.aspx) –

+0

вот что я пытаюсь достичь _users.Any (x => " Стив Сэм Стюард Спаситель Сана ".ToLower(). Содержит (x.name.ToLower())); – HaBo

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)); 
+0

«Стив Сэм Стюард Спаситель Сана» - это динамическая строка, которая может иметь альфа-числовые значения. для того, чтобы следовать вашему пути, мне придется разделить строку по пробелу и выполнить регулярное выражение – HaBo

+0

да, это не проблема для вызова «name1 name2» .Split ('') для tokenize поискового запроса –

+0

Извините. Плохая идея использовать регулярное выражение для поиска подстановочных знаков при работе с 1000-ыми записями – HaBo

Смежные вопросы