Найти документ по частичному строковому значению внутри элемента массива в MongoDB из Azure - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь найти все lists, которые person number содержат '-' или '.' внутри. Я уже попробовал этот ответ , но он не работает для элементов внутри массива.

Но когда я пытаюсь найти по всей строке, без записи regex, документ обнаруживается.

За пример:

db.getCollection('list').find({"persons.number": "123456789"}) //works!

db.getCollection('list').find({"persons.number": /3/}) //not work...
db.getCollection('list').find({"persons.number": /.*3.*/}) //not work
db.getCollection('list').find({"persons.number": /.*..*/}) //not work
db.getCollection('list').find({"persons.number": /.*[-\.]+.*/}) //not work

Если я попытаюсь найти документ по некоторому атрибуту вне массива (атрибут из list, для примера), /3/, /.*3.*/ и /.*[-\.]+.*/ работает .

Формат документа:

{
    "_id" : ObjectId("5af3037ee8006c4a04e84b2f"),
    "id" : 1,
    "persons" : [ 
        {
            "id" : 1,
            "number" : "123.123.123-22"
        }, 
        {
            "id" : 2,
            "number" : "123.456.789-11"
        }
    ]
}

Итак, какие есть варианты?

Я использую MongoDB из Azure. Выполнение db.version() на консоли возвращает 3.2.0.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Для поиска нескольких шаблонов, т. Е. ИЛИ шаблонов, формат регулярных выражений немного отличается.

(pattern1)|(pattern2)

Пробовал приведенный ниже запрос на монго на моем локальном компьютере 3.4.6, но он должен работать и на 3.2.x

db.list.aggregate([{"$unwind":{"path":"$persons"}},{"$project":{"_id":1,"persons.number":1}},{"$match":{"persons.number":{"$regex":/.*(\.)|(\-).*/}}},{"$group":{_id:"$_id"}}])
0 голосов
/ 09 мая 2018

регулярное выражение .*[-\.]+.* должно работать,

Попробуйте это,

db.getCollection('list').find({"persons.number": /.*[-\.]+.*/})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...