Использование условия $ in для нечувствительного поиска в драйвере mongo db c # - PullRequest
1 голос
/ 28 мая 2019

Мне интересно, как использовать безразличный для $ в выражениях.

В соответствии с официальным руководством MongoDB вы можете сделать это:

{ name: { $in: [ /^acme/i, /^ack/ ] } }

Я проверил это на компасе, и он работает нормально, поиск нечувствителен.

Мне нужно это с помощью драйвера Mongo в C #.

Я делаю это:

  var array = new BsonArray(companyNames);

  var filter = new BsonDocument { { "Name", new BsonDocument { { "$in", new BsonArray(array) }} } };
  var result = _collection.Find(filter).ToList();

companyNames - это строка []

Однако это возвращает мне только точные совпадения. Это очевидно, потому что я не включаю выражение "регулярное выражение". Но я не знаю, как я могу включить регулярное выражение в строку.

Обходной путь - создать $ или выражение с регулярным выражением для каждого названия компании.

Кто-нибудь знает, как это сделать?

Спасибо

Ответы [ 2 ]

1 голос
/ 28 мая 2019

С mongo-csharp-driver вы можете использовать MongoDB.Bson.BsonRegularExpression . Вы можете выполнить:

var arrayIn = new BsonArray().Add(
                      new BsonRegularExpression("^acme", "i")
                  ).Add(
                      new BsonRegularExpression("^ack"));
var filter = new BsonDocument { { "name", new BsonDocument { { "$in", arrayIn }} } };
var cursor = collection.Find(filter).ToList();

Или вместо string используйте Regex и RegexOptions :

var arrayIn = new BsonArray().Add(
                      new BsonRegularExpression(
                          new Regex(
                              "^acme", RegexOptions.IgnoreCase))
                  ).Add(new BsonRegularExpression(
                              "^ack"));
0 голосов
/ 30 мая 2019

Вот элегантное решение, использующее текстовый индекс в поле названия компании.

using MongoDB.Entities;

namespace StackOverflow
{
    class Program
    {
        public class Company : Entity
        {
            public string Name { get; set; }
        }

        static void Main(string[] args)
        {
            new DB("test");

            DB.Index<Company>()
              .Key(c => c.Name, KeyType.Text)
              .Option(o => o.Background = false)
              .Create();

            var c1 = new Company { Name = "Ackme" };
            var c2 = new Company { Name = "Acme" };
            var c3 = new Company { Name = "Lackme" };
            var c4 = new Company { Name = "Hackme" };

            c1.Save(); c2.Save(); c3.Save(); c4.Save();

            var names = new[] { "ackme", "acme" };

            var result = DB.SearchText<Company>(string.Join(" ", names));
        }
    }
}

Обратите внимание, что выше используется удобная библиотека MongoDB.Entities .однако понятия те же, но синтаксис официального драйвера громоздок по сравнению с приведенным выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...