2012-01-13 26 views
8

tôi cố gắng truy vấn MongoDB thông qua Casbah cho một trường là một chuỗi các chuỗi với một regexp.Làm thế nào để truy vấn một mảng [String] cho một trận đấu regexp?

Ví dụ:

Tôi có một Maschine có danh sách ips, được lưu trữ dưới dạng chuỗi trong trường ips. Bây giờ tôi muốn tìm kiếm tất cả các máy có mạng con 192.168.

Đối với tôi, tôi có vẻ như không thể truy vấn một mảng có regexp được áp dụng cho mọi mục nhập và nếu một trong các mục nhập khớp với máy được trả về.

Bất kỳ cách nào để thực hiện truy vấn như vậy?

- Cố định

Cảm ơn sự giúp đỡ của bạn.

Mọi thứ hoạt động ngay bây giờ. Cuối cùng tôi cần phải làm việc xung quanh một giới hạn của Casbah, bởi vì tôi cần thiết để tham gia vào các truy vấn với $ hoặc và Casbah phàn nàn về việc thiếu các implicit với regexp.

mã cuối cùng của tôi cho một truy vấn RegExp Array với một lĩnh vực khác thêm là:

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) 

Nó không phải là mã đẹp nhất và chuỗi nối của tham số cần phải được cố định. Nhưng nó hoạt động :)

Trả lời

12

Bạn có thể bỏ qua thực tế rằng đây là một mảng:

> 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 luôn cư xử như thế này: nếu bạn đối xử với một mảng giống như một lĩnh vực bình thường, nó sẽ áp dụng các hoạt động cho từng thành viên, và nếu một đối sánh, xem xét tài liệu gốc phù hợp.

0

Xem nếu $elemMatch query operator sẽ hoạt động cho bạn.

+0

Tôi đã thử nó rồi. $ elemMatch hy vọng rằng mảng của tôi có cặp khóa/giá trị. Nhưng tôi chỉ có các chuỗi đơn giản. – Odo

Các vấn đề liên quan