将特定的返回查询转换为mgo

时间:2018-04-13 11:30:41

标签: regex mongodb go mgo

我有一个查询,它返回包含特定文本的集合文档中的所有名称。在下面的示例中,返回包含序列“oh”不区分大小写的所有名称;不要返回文档中的其他字段:

find({name:/oh/i}, {name:1, _id:0})

我试图将此查询翻译成mgo:

Find([]bson.M{bson.M{"name": "/oh/i"}, bson.M{"name": "1", "_id": "0"}})

但使用mgo时总是没有结果。使用mgo进行此类查询的正确语法是什么?

这个问题与所谓的重复问题不同,因为这些问题都没有涉及如何限制MongoDB仅返回特定字段而不是整个文档。

1 个答案:

答案 0 :(得分:1)

要执行使用正则表达式模式进行过滤的查询,请使用bson.RegEx类型。

要从结果文档中排除字段,请使用Query.Select()方法。

就像这个例子一样:

c.Find(bson.M{"name": bson.RegEx{Pattern: "oh", Options: "i"}}).
    Select(bson.M{"name": 1, "_id": 0})

正则表达式的翻译:

name:/oh/i

这意味着匹配name字段的值包含"oh"子字符串且不区分大小写的文档。这可以使用bson.RegEx来表示,其中RegEx.Pattern字段获取上述表达式中使用的模式("oh")。 RegEx.Options现在可以包含应用/匹配模式的选项。该文档列出了可能的值。如果Options字段包含'i'字符,则表示匹配不区分大小写。

如果您有一个用户输入的术语,例如"[a-c]",则必须引用regexp元字符,因此您应用的最终模式应为"\[a-c\]"为了方便起见,请使用{{3功能,例如

fmt.Println(regexp.QuoteMeta("[a-c]")) // Prints: \[a-c\]

regexp.QuoteMeta()上尝试。