2016-11-07 5 views
4

У меня есть ситуации, когда записи в Монго БД как:Поиск с динамическим именем поля в MongoDB

{ 
"_id" : "xxxx", 
"_class" : "xxxx", 
"orgId" : xxx, 
"targetKeyToOrgIdMap" : { 
    "46784_56139542ecaa34c13ba9e314" : 46784, 
    "47530_562f1bc5fc1c1831d38d1900" : 47530, 
    "700004280_56c18369fc1cde1e2a017afc" : 700004280 


    }, 
} 

я должен выяснить записи, где дочерние узлы targetKeyToOrgIdMap имеют определенный набор значений. Это означает, что я знаю, какая ценность будет в записи в «46784_56139542eca34c13ba9e314»: 46784 часть. И имя поля является переменным, его комбинацией значения и некоторой случайной строки.

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

Можно ли каким-либо образом запустить какое-то регулярное выражение или что-то в этом роде или с помощью любого другого значения, в котором я получаю записи, которые имеют значение, которое мне нужно в дочерних узлах поля targetKeyToOrgIdMap.

Заранее спасибо

+0

Невозможно использовать метод 'find()', возможно, с 'mapReduce'. Возможно, вам придется рассмотреть возможность изменения вашей схемы, чтобы сделать «targetKeyToOrgIdMap» массив объектов с ключевыми и значениями свойств, которые проще запросить: «targetKeyToOrgIdMap»: [{«id»: «46784_56139542eca34c13ba9e314», «value»: 46784} , { "id": "47530_562f1bc5fc1c1831d38d1900", "value": 47530}] ' – chridam

+0

изменение схемы будет невозможно. Я должен, возможно, пропустить это или что-то в этом роде. Спасибо @chridam –

ответ

1

Вы могли бы использовать MongoDB-х $where вроде этого:

db.myCollection.find({ $where: function() { 
    for (var key in obj.targetKeyToOrgIdMap) { 
    if (obj.targetKeyToOrgIdMap[key] == 46784){ 
     return true; 
    } 
    } 
}}).each { obj -> 
    println obj 
} 

Но следует знать, что это потребует полного сканирования таблицы, где функция выполняется для каждого документа. См. documentation.

+0

Это выглядит многообещающим. Простите мое невежество здесь, я очень новичок в MongoDB; как я могу получить записи? Запрос выполнен успешно, но не было записей. Я пробовал делать несколько вещей, таких как return key/return {}, но не работал. Не могли бы вы оказать мне некоторую помощь? –

+0

В зависимости от драйвера базы данных вы используете 'find', вероятно, вернете курсор базы данных, с которым вы получите доступ к результатам. Какой драйвер вы используете? – Erik

+0

Я использую gmongo с groovy. –