mongoDB - Регулярный поиск по частичным значениям поля - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть коллекция стран с кодом страны в объекте страны. Как я могу найти страну, используя код вызова с номером мобильного телефона?

const countries = [
  {
    name: 'UAE',
    callingCode: 971
  },
  {
    name: 'USA',
    callingCode: 1
  },
  {
    name: 'UK',
    callingCode: 44
  }
];

const number = '971524500000'; // Input

Как я могу найти страну для данного мобильного телефона, используя regex в пн goose javascript;

Ответы [ 3 ]

0 голосов
/ 09 апреля 2020

Если вы можете реструктурировать свой массив в объект, это будет самый быстрый

const countries = 
  {
    971: 'UAE', 
    1: 'USA', 
    44: 'UK',
    
  }
;


var code = 44;

console.log(countries[code]);

const countries = [
  {
    name: 'UAE',
    callingCode: 971
  },
  {
    name: 'USA',
    callingCode: 1
  },
  {
    name: 'UK',
    callingCode: 44
  }
];


 var myFound =countries.filter(myFunc.bind(this,44));
 
 

function myFunc(code,element) {


  if(element.callingCode == code){
     
     return element;
  }
}

console.log(myFound);
0 голосов
/ 09 апреля 2020

В MongoDB v 4.2 - вы можете использовать $ let & $ regexFind для этого:

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $eq: [
          {
            $let: {
              vars: {
                value: {
                  $regexFind: {
                    input: "971524500000", // pass in as string
                    regex: { $toString: "$callingCode" }
                  }
                }
              },
              in: "$$value.idx",
            }
          },
          0
        ]
      }
    }
  }
]);

Тест: MongoDB-Playground

Объяснение:

Общий вариант использования:

В общем регулярное выражение поиски - будет иметь ввод, который будет подстрокой фактической строки, Пример: -

Фактическая строка в БД: 'Мы можем сделать это в пн go '

Ввод: пн go (/mongo/ - будет работать)

Ваш вариант использования:

Сверху, так как mongo существует в фактической строке / значении поля дб, тогда вы можете получить этот документ, но ваш случай другой:

Фактическая строка в БД: mon go

Ввод: 'Мы можем сделать это в понедельник go'

Это не сработает, поэтому использование обычного /We can do it in mongo/ isn ' Тебе здесь помочь (также делаю несколько трюков с регулярным выражением). Поэтому нам нужно сделать трюк с оператором $regexFind. В отличие от документации mon go нам нужно взять 971524500000 в input field & regex как строковое значение поля callingCode, которое противоположно тому, что указано в документации.

Так что, как только мы это сделаем, Мы получили бы что-то вроде ниже:

{
    "match" : "971", /** value of callingCode field */
    "idx" : 0, /** Index of `971` in '971524500000' */
    "captures" : []
},{
        "match" : "1",
        "idx" : 2,
        "captures" : []
},
null /** 3rd doc no match */

Поскольку код страны должен быть в начале данного числа, нам нужны документы, где "idx" : 0 - поэтому мы используем $let, чтобы получить индекс возвращенного объекта & проверка по 0 и, в конечном итоге, получение соответствующих документов с использованием $match.

Примечание:

Есть что-то, что вам нужно изучить, на всякий случай, если вы ' Если у вас есть документы, подобные приведенным ниже:

  {
    "_id": ObjectId("5e8f67091aa1cc3d2158ade1"),
    "name": "USA",
    "callingCode": 1.0
  },
  {
    "_id": ObjectId("5e8f67091aa1cc3d2158ade3"),
    "name": "somecountry",
    "callingCode": 197.0
  }

& input - 1971524500000, тогда этот запрос приведет к получению обоих документов. Это будет случай, когда вам нужно проверить. В любом случае, я бы посоветовал попробовать этот запрос, вместо того, чтобы пересылать все документы для сбора в код и извлекать необходимые данные, о / п. Это может быть лучше сделать.

0 голосов
/ 09 апреля 2020

[https://en.wikipedia.org/wiki/List_of_country_calling_codes] [1]

Взгляните на ссылку выше по кодам вызова страны и, в частности, смотрите раздел «Древовидный список».

Одним из решений будет реализация схемы в Mon go на основе этого дерева для декодирования кодов стран.

Таким образом, можно создать таблицу для хранения документов Mon go, содержащих поле " 1x "" 2x "" 21x "et c (ось Y в таблице Tree List).

Каждый из этих документов может содержать массив поддокументов от x = 0 до x = 9 ( ось х в таблице списка деревьев). Субдокумент может содержать название страны / код, который вы ищете. Вы можете использовать прямой индекс в массиве в документе Mon go для эффективного поиска.

Я думаю, вы найдете это довольно эффективной реализацией, которая должна охватывать все основы.

...