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

Приведенный выше запрос найдет все имена пользователей, соответствующие "Стив Сэм Стюард, Спаситель Сана". Но я хочу, чтобы любое имя пользователя совпадало с любым словом в "Стив, Сэм, Стюард, Спаситель, Сана"

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

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

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

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

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

person HaBo    schedule 27.03.2014    source источник
comment
Разве вы не должны делать предложение in?   -  person Izaaz Yunus    schedule 27.03.2014


Ответы (2)


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

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

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

person Anand Jayabalan    schedule 27.03.2014
comment
Я не думаю, что это возможно в MongoDB. Можете ли вы не использовать метод String для разделения/маркировки строки в вашей клиентской программе? Я только что погуглил и нашел это - person Anand Jayabalan; 27.03.2014
comment
вот чего я пытаюсь добиться _users.Any(x =› Steve Sam Steward Savior Sana.ToLower().Contains(x.name.ToLower())); - person HaBo; 28.03.2014

Вы можете использовать:

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));
person Marjan Nikolovski    schedule 27.03.2014
comment
Steve Sam Steward Savior Sana это динамическая строка, которая может иметь буквенно-цифровые значения. чтобы следовать вашему пути, мне придется разделить строку по пробелу и выполнить совпадение с регулярным выражением - person HaBo; 28.03.2014
comment
да, не проблема вызвать name1 name2.Split(' ') для токенизации поискового запроса - person Marjan Nikolovski; 28.03.2014
comment
Извиняюсь. плохая идея использовать регулярное выражение для поиска по шаблону при работе с тысячами записей - person HaBo; 28.03.2014
comment
При использовании начинается с (^) в индексированном поле имени пользователя, это не будет проблемой. Я реализовал это решение и запустил его на 10 М пользовательских тестовых данных. Работает как часы. - person Marjan Nikolovski; 28.03.2014