2012-01-13 5 views
8

私は、正規表現を持つ文字列の配列であるフィールドに対して、Casbahを介してMongoDBをクエリしようとします。例えば正規表現一致のために配列[String]をクエリするには?

私は、フィールドのIPSに文字列として保存されているIPのリストとMaschineのを、持っています。 サブネット192.168を持つすべてのマシンを検索します。

私にとっては、私はすべてのエントリに適用された正規表現を使って配列を問い合わせることができないと思われます。そして、エントリの1つがマシンに一致した場合、返されます。

このようなクエリを作成する方法はありますか?

- 固定

ありがとうございました。

すべて動作します。最後に、私は$ orのクエリに参加する必要があったので、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) 

それは素敵なコードではなく、パラメータの文字列連結を修正する必要があります。しかしそれは働く:)

答えて

12

> 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は、常にこのように振る舞う:あなただけの通常のフィールドのような配列を扱う場合、それは各メンバーに操作を適用すると、場合します1つは一致し、親文書は一致とみなされます。

0

$elemMatch query operatorがあなたのために働くかどうか見てください。あなたは、これは配列であるという事実を無視することができ

+0

私はすでに試しました。 $ elemMatchは、配列にキーと値のペアがあると想定しています。しかし、私は単純な文字列しか持っていません。 – Odo

関連する問題