将特定 return 查询翻译成 mgo

Translate specific return query into mgo

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

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 进行此类查询的正确语法是什么?

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

要执行使用正则表达式模式进行过滤的查询,请使用 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]",您必须引用正则表达式元字符,因此您应用的最终模式应该是 "\[a-c\]" 要轻松做到这一点,请使用 regexp.QuoteMeta() 函数,例如

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

Go Playground 上试用。