在mongodb-go-driver中通过子字符串正则表达式查询查找条目

时间:2019-03-28 13:25:57

标签: mongodb go mongo-go

我无法获得go go mongo官方驱动程序来成功返回通过正则表达式查询查询的对象。

我已经知道如何通过mongo shell进行操作并获得预期的结果。 在此示例中,我将在其“文本”字段中获取所有包含“ he”的条目:

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存储库中,每个example都可以正常工作。

我当前在集合中的条目仅包含2个字段,id字段和一个额外的文本字段。我目前有3个条目。看起来像这样:

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

我上面代码的预期结果应该是前2个条目。相反,我得到一个空光标。

有人知道,我在做什么错吗? 感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

primitive.Regex结构接受Pattern值且不使用斜杠,因此它必须是:

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