-2

I get the following error from my editor: undefined: bson.RegEx

due to this line of code in my go project:

regex := bson.M{"$regex": bson.RegEx{Pattern: id, Options: "i"}}

Why am I getting this error and how can I resolve it?

I've made sure that I'm importing:

"go.mongdb.org/mongo-driver/bson"

I've also checked inside bson/primitive/primitive.go to see that RegEx does exist

Using version 1.1.0 of mongo-driver.

Brendan
  • 834
  • 1
  • 9
  • 20
  • 1
    You don't say which version you're using, but [the current version](https://godoc.org/go.mongodb.org/mongo-driver/bson) doesn't export `RegEx`. It also doesn't have a file `bson/primitive.go`, so I'm not sure what you're looking at, unless it's a really old version. – Jonathan Hall Aug 18 '19 at 13:50

2 Answers2

2

Managed to work around the problem by removing this:

regex := bson.M{"$regex": bson.RegEx{Pattern: id, Options: "i"}}

and add this instead:

regex := `(?i).*` + name + `.*`
filter = bson.M{"name": bson.M{"$regex": regex}}
Brendan
  • 834
  • 1
  • 9
  • 20
1

Why am I getting this error and how can I resolve it?

Using mongo-go-driver v1+, you can utilise bson.primitive. For example:

patternName := `.*` + name + `.*`
filter := bson.M{"name": primitive.Regex{Pattern: patternName, Options:"i"}}
cursor, err := collection.Find(context.TODO(), filter)

This is imported from "go.mongodb.org/mongo-driver/bson/primitive".

In addition, I would also suggest to consider the search pattern. You can optimise a regex search if the regular expression is a “prefix expression”, which means that all potential matches start with the same string. For example, ^name.* will be optimised by matching only against the values from the index that starts with name.

Also worth noting that case insensitive regular expression queries generally cannot use indexes effectively. The $regex implementation is not collation-aware and is unable to utilise case-insensitive indexes. Please see $regex index use for more information.

Depending on the use case, consider MongoDB Text Search. For example, you can create a text index:

db.collection.createIndex({"name":"text"});

Which then you can search using:

filter := bson.M{"$text": bson.M{"$search": name}}
cur, err := collection.Find(context.TODO(), filter)

Also worth mentioning depending on your requirements, there's also MongoDB Atlas Full Text Search feature for advanced search functionality. i.e. text analysers.

Wan B.
  • 18,367
  • 4
  • 54
  • 71