【问题标题】:How to query a Array[String] for a regexp match?如何查询 Array[String] 的正则表达式匹配?
【发布时间】:2012-01-13 15:27:43
【问题描述】:

我尝试通过 Casbah 向 MongoDB 查询一个字段,该字段是带有正则表达式的字符串数组。

例如:

我有一个带有 ips 列表的 Maschine,这些 ips 以字符串形式存储在字段 ips 中。 现在我想搜索所有具有子网 192.168 的机器。

对我来说,我似乎无法使用应用于每个条目的正则表达式来查询数组,并且如果其中一个条目匹配则返回机器。

有什么方法可以进行这样的查询吗?

-- 固定

感谢您的帮助。

现在一切正常。最后,我需要解决 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)

这不是最好的代码,参数的字符串连接需要修复。但它有效:)

【问题讨论】:

    标签: scala mongodb casbah salat


    【解决方案1】:

    你可以忽略这是一个数组的事实:

    > 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 的行为总是这样:如果您将数组视为普通字段,它会将操作应用于每个成员,如果匹配,则将父文档视为匹配。

    【讨论】:

      【解决方案2】:

      看看$elemMatch query operator 是否适合你。

      【讨论】:

      • 我已经试过了。 $elemMatch 期望我的数组有键/值对。但我只有简单的字符串。
      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多