我有一个查询,它返回包含特定文本的集合文档中的所有名称。在下面的示例中,返回包含序列“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仅返回特定字段而不是整个文档。
答案 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()
上尝试。