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

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

Например:

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

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

Есть ли способ сделать такой запрос?

- Исправлено

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

Теперь все работает. В конце мне нужно обойти одно ограничение Casbah, потому что мне нужно было присоединиться к запросам с $ или, и 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)

Это не самый лучший код, и конкатенация параметров должна быть исправлена. Но это работает :)

Ответы [ 2 ]

12 голосов
/ 13 января 2012

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

> 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 всегда ведет себя так: если вы обрабатываете массив как обычное поле, он применяет операцию к каждому члену и, если он совпадает, считает родительский документ соответствующим.

0 голосов
/ 13 января 2012

Посмотрите, будет ли работать оператор запроса $elemMatch .

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