mongodb之MongoDB Regex忽略名称中的破折号

zhujiabin 阅读:48 2025-06-02 22:19:02 评论:0

我想通过搜索词eq来查找Place.Name:"saint germain"
我使用 go.mongodb.org/mongo-driver/mongo

集合场所看起来像:

type ( 
    Place struct { 
        ID      primitive.ObjectID `bson:"_id,omitempty" json:"_id"` 
        Name    string             `json:"name,omitempty" bson:"name"` 
        ... 
    } 
) 

数据库名称看起来像:
"Saint-Germain-l'Auxerrois, Paris", 
"Halles, Paris", 
"Palais-Royal, Paris", 
"Place-Vendôme, Paris", 
"Gaillon, Paris", 
"Vivienne, Paris", 
"Mail, Paris", 
"Bonne-Nouvelle, Paris", 
"Arts-et-Métiers, Paris", 
"Enfants-Rouges, Paris", 
"Archives, Paris", 

我的mongodb Req:

query := "saint germain"  
XXX.Collection("places").Find(context.Background(), bson.M{"name": primitive.Regex{Pattern: ".*" + query + ".*", Options: "i"}}) 

想要结果
"Saint-Germain-l'Auxerrois, Paris", 

我想忽略“破折号”,如何调整“regex”,以便它可以通过“saint germain”查询找到“Saint-Germain-l'Auxerrois,Paris”

请您参考如下方法:

我想忽略“破折号”,如何调整“regex”,以便它可以通过“saint germain”查询找到“Saint-Germain-l'Auxerrois,Paris”

建议不要使用Regex来搜索,而是运行MongoDB Text Search来执行对字符串内容进行文本搜索的查询操作。

首先,您需要在集合上创建text index。请注意,一个集合只能有一个文本搜索索引,但是一个索引可以覆盖多个字段。例如:

db.places.createIndex({"name": "text"}) 

在您的Go代码中,您可以执行以下操作:
collection := client.Database("databaseName").Collection("places") 
query := bson.M{"$text": bson.M{"$search": "saint germain"}} 
cursor, err := collection.Find(context.Background(), query) 

另外,如果您的群集位于 MongoDB Atlas中,并且您正在寻找细粒度的文本索引以获取更高级的搜索功能,请参见 MongoDB Atlas: Full Text Search

全文搜索使用户可以利用 Apache Lucene的功能进行文本搜索。例如:
collection := client.Database("databaseName").Collection("places") 
location := "saint germain" 
pipeline := mongo.Pipeline{ 
        {{"$searchBeta", bson.D{ 
                {"search", bson.D{ 
                    {"query", location}, 
                    {"path", "name"}}, 
                }}, 
        }}, 
} 
cursor, err := collection.Aggregate(context.Background(), pipeline) 

上面的代码片段将返回类似的结果 name: "Saint-Germain-l'Auxerrois, Paris"。这些片段是使用 mongo-go-driver v1.2.x和MongoDB v4.2.x编写的。


标签:mongodb
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号