Как запросить массив [String] для соответствия регулярному выражению?

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

Например:

У меня есть Maschine со списком ips, которые хранятся в виде строки в полях ips. Теперь я хочу найти все машины с подсетью 192.168.0.

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

Любой способ сделать такой запрос?

-- Фиксированный

Спасибо за вашу помощь.

Теперь все работает. В конце мне нужно обойти одно ограничение Casbah, потому что мне нужно было присоединиться к запросам с помощью $or, а Casbah жалуется на отсутствие имплицитов в регулярном выражении.

Мой окончательный код для запроса массива RegExp с дополнительным другим полем:

val regexp = ".*" + parameter + ".*"
val nameQ = MongoDBObject("serverName" -> regexp.r)
val ipsQ = MongoDBObject("ips" -> regexp.r)
val bldr = MongoDBList.newBuilder
bldr += ipsQ
bldr += nameQ
val query = MongoDBObject("$or" -> bldr.result.asDBObject)
val result = find(query)

Это не самый красивый код, и необходимо исправить конкатенацию строк параметра. Но это работает :)


person Odo    schedule 13.01.2012    source источник


Ответы (2)


Вы можете игнорировать тот факт, что это массив:

> db.rx.insert( { "ips" : ["192.168.1.231", "192.168.2.231", "120.32.42.51"] });
> db.rx.find( { ips : /192./ } )
{ "_id" : ObjectId("4f104f0183bfca7a48b60da1"), 
  "ips" : [ "192.168.1.231", "192.168.2.231", "120.32.42.51" ] }

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

person mnemosyn    schedule 13.01.2012

Посмотрите, подойдет ли вам $elemMatch оператор запроса.

person maerics    schedule 13.01.2012
comment
Я уже пробовал. $elemMatch ожидает, что в моем массиве есть пары ключ/значение. Но у меня есть только простые строки. - person Odo; 13.01.2012