8

正規表現を含む文字列の配列であるフィールドについて、Casbah 経由で MongoDB にクエリを実行しようとしています。

例えば:

フィールドipsに文字列として保存されているipsのリストを持つMaschineがあります。ここで、サブネット 192.168 を持つすべてのマシンを検索したいと考えています。

私にとっては、すべてのエントリに正規表現が適用された配列をクエリすることはできず、エントリの1つがマシンに一致すると返されるようです。

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

- 修理済み

ご協力いただきありがとうございます。

すべてが機能するようになりました。最後に、Casbah の 1 つの制限を回避する必要があります。これは、$or を使用してクエリに参加する必要があり、Casbah が正規表現の暗黙の欠落について不平を言うためです。

他のフィールドを追加した RegExp Array クエリの最終的なコードは次のとおりです。

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)

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

4

2 に答える 2

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は常に次のように動作します。配列を通常のフィールドと同じように扱うと、各メンバーに操作が適用され、一致する場合は親ドキュメントが一致すると見なされます。

于 2012-01-13T15:37:22.357 に答える
0

$elemMatchクエリ演算子が機能するかどうかを確認してください。

于 2012-01-13T15:32:41.410 に答える