Поиск записей с помощью запроса регулярных выражений подстроки в mongodb-go-driver - PullRequest
2 голосов
/ 28 марта 2019

Я не могу заставить официальный драйвер go mongo успешно возвращать объекты, запрашиваемые с помощью запроса регулярных выражений.

Я уже знаю, как это сделать через оболочку mongo и получить ожидаемые результаты.В этом примере я получаю все записи, которые содержат «он» в их поле «текст»:

db.getCollection('test').find({"text": /he/})

то же самое с этим:

db.getCollection('test').find({"text": {$regex: /he/, $options: ''}})

Это мой текущий код, который не 'Это работает:

package main

import (
    "context"
    "fmt"
    "time"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), time.Duration(5*time.Second))
    defer cancel()
    client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))
    if err != nil {
        fmt.Println(err)
        return
    }
    err = client.Connect(ctx)
    if err != nil {
        fmt.Println(err)
        return
    }
    db := client.Database("test")
    coll := db.Collection("test")

    filter := bson.D{{"text", primitive.Regex{Pattern: "/he/", Options: ""}}}
    ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    cur, err := coll.Find(ctx, filter)
    if err != nil {
        fmt.Println(err)
        return
    }

    i := 0
    for cur.Next(ctx) {
        i = i + 1
    }
    fmt.Println("Found", i, "elements")
}

Для пример в официальном репозитории mongo-go-driver, это должно работать.

Мои текущие записи в коллекции содержат только 2 поля, поле id и дополнительное текстовое поле.В настоящее время у меня есть 3 записи.это выглядит так:

{
    "_id" : ObjectId("5c9cc7e9950198ceeefecbdd"),
    "text" : "hello world"
},
{
    "_id" : ObjectId("5c9cc7f6950198ceeefecbec"),
    "text" : "hello"
},
{
    "_id" : ObjectId("5c9cc804950198ceeefecbfa"),
    "text" : "test world"
}

Мои ожидаемые результаты с кодом сверху, должны быть первые 2 записи.Вместо этого я получаю пустой курсор назад.

Кто-нибудь знает, что я делаю не так?Спасибо за вашу помощь.

1 Ответ

1 голос
/ 28 марта 2019

primitive.Regex struct принимает Pattern значение без косой черты, поэтому оно должно быть:

filter := bson.D{{"text", primitive.Regex{Pattern: "he", Options: ""}}}
...