4

现在我有一些文档,每个文档都有一个键path和值,例如\A\, \B\, \A\C\, \A\C\D\, \A\E\, \A\E\F\

我想找到只有 1 段的那些。这意味着结果应该是\A\and \B\。我使用 Regular Expression /^\\[^\\]*\\$/,它在 MongoDB 终端中运行良好。但是当我试图将它应用到 Go 程序时它不起作用。

去代码:

var nodeList []NodeEntry // NodeEntry would match every field of one document
err = c.Find(bson.M{"path": bson.M{"$regex": bson.RegEx{"^\\[^\\]*\\$", ""}}}).All(&nodeList)
fmt.Println(nodeList)

输出:

[]

太奇怪了,然后我发现任何 Regex\\都会产生一个空的结果。

那么它是mgo的一个错误吗?

(我不知道这是否不合适,但我也在mgo.users 邮件列表上发布了这个问题。)

4

3 回答 3

6

在 Go 中,反斜杠 ( \) 是解释字符串文字的转义字符(使用 "..." 作为附件)。在您的情况下,您宁愿使用原始字符串文字(使用 `...` 作为附件)。

让我们看一下这段代码:

package main

import "fmt"

func main() {
    fmt.Println("^\\[^\\]*\\$")
    fmt.Println(`^\\[^\\]*\\$`)
}

结果:

^\[^\]*\$
^\\[^\\]*\\$

您可以看到第二个选项是您想要的正则表达式字符串。因此,要解决您的问题,只需将您的正则表达式字符串括在反引号而不是引号中:

err = c.Find(bson.M{"path": bson.M{"$regex": bson.RegEx{`^\\[^\\]*\\$`, ""}}}).All(&nodeList)

Go 规范参考: http: //golang.org/ref/spec#String_literals

于 2014-04-10T22:44:46.637 回答
1

要添加到@sandun-priyanka 解决方案,如果要使其不区分大小写:

selector:= bson.M{"title": bson.M{"$regex": `(?i)`+wordOffset}}
于 2018-06-22T16:21:28.193 回答
0

只需使用这个

   wordOffset := anyregular expression OR text to filter

   selector:= bson.M{"title": bson.M{"$regex": wordOffset}}
于 2018-03-12T19:12:22.767 回答