如何查询 Array[String] 中的正则表达式匹配项?

发布于 2024-12-26 10:46:13 字数 729 浏览 2 评论 0原文

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

例如:

我有一个带有 ip 列表的 Maschine,这些列表作为字符串存储在 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)

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

i try to query MongoDB via Casbah for a field that is a array of strings with a regexp.

For example:

I have a Maschine with a list of ips, that are stored as string in the fields ips.
Now i want to search for all machines that have the subnet 192.168.

For me i looks like that the i cannot query an array with a regexp applied to every entry and if one of the entries matches the machine is returned.

Any way to make such a query ?

-- Fixed

Thanks for your help.

Everything works now. At the end i need to work around one limitation of Casbah, because i needed to join to queries with $or and Casbah complains about missing implicits with the regexp.

My final code for a RegExp Array query with an additional other field is:

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)

It is not the nicest code and the string concatenation of the parameter needs to be fixed. But it works :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱格式化 2025-01-02 10:46:13

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

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

You can ignore the fact that this is an array:

> 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 always behaves like this: if you treat an array just like a normal field, it will apply the operation to each member and, if one matches, consider the parent document a match.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文