MongoDB Query.And не поддерживает совпадения - PullRequest
1 голос
/ 18 мая 2011

Я использую поисковую фразу в коллекции MongoDB. Моя фраза может содержать более одного термина, например искать «Пит Смит». Поэтому мне нужно использовать регулярные выражения, чтобы обеспечить функцию «начинается с». Поэтому я создаю массив запросов Query.Matches, добавляю их в массив QueryComplete, а затем использую Query.And для их запуска.

Код выглядит следующим образом:

// searchTerm will be something like 'pete smit'
string[] terms = searchTerm.Split(' ');

MongoDB.Driver.Builders.QueryComplete[] qca;
qca = new MongoDB.Driver.Builders.QueryComplete[terms.Length];
for (int i = 0; i < terms.Length; i++)
{
    regex = "/(\\b" + terms[i] + ")+/i"; // Good, but only single term (\b is start of word)
    qca[i] = MongoDB.Driver.Builders.Query.Matches("companyname", regex);
}
//MongoDB.Driver.Builders.QueryComplete qry = MongoDB.Driver.Builders.Query.Or(qca); // This works
MongoDB.Driver.Builders.QueryComplete qry = MongoDB.Driver.Builders.Query.And(qca); // This fails

При выполнении запроса. И я получаю сообщение об ошибке:

Query.And does not support combining equality comparisons with other operators (field: 'companyname')

Хорошо работает, если я использую Query.Or, но не работает, если я использую Query.And. Кто-нибудь может предложить обходной путь? Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 18 мая 2011

Обходной путь заключается в том, чтобы заключить несколько поисковых терминов в одно регулярное выражение следующим образом:

string[] terms = searchTerm.Split(' ');
regex = "/";
for (int i = 0; i < terms.Length; i++)
{
    regex += "(?=.*\\b" + terms[i] + ")";
}
regex += ".*/i";
MongoDB.Driver.Builders.QueryComplete query = MongoDB.Driver.Builders.Query.Matches("companyname", regex); // The ^ matches the start of the string

См. Регулярное выражение для соответствия всем условиям поиска

0 голосов
/ 03 мая 2012

Оператор $and MongoDB теперь реализован и полностью функционален. См. http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24and для использования, поэтому ваш оригинальный MongoDB.Driver.Builders.Query.And(qca); теперь должен работать.

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

0 голосов
/ 18 мая 2011

Пока MongoDB не поддерживает $ и все подзапросы передаются в Query.And должен быть для разных полей (чтобы нельзя было применять разные регулярные выражения к одному и тому же полю).

...