duanhuang7591 2019-03-28 13:25
浏览 242
已采纳

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

I can't get the official go mongo driver to successfully return objects that are queried via a regex query.

I already know how to do it via the mongo shell and get my expected results. With this example i get all entries that contain "he" in their 'text' field:

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

same with this one:

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

This is my current code that doesn't work:

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")
}

Per example in the official mongo-go-driver repository, this should work.

My current entries in the collection just contain 2 fields, the id field and an extra text field. I currently have 3 entries. that look like this:

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

My expected results with the code from above, should be the first 2 entries. Instead i get an empty cursor back.

Does anybode know, what i am doing wrong? Thanks for your help.

  • 写回答

1条回答 默认 最新

  • douzhi4311 2019-03-28 14:03
    关注

    primitive.Regex struct accepts Pattern value without slashes, so it must be:

    filter := bson.D{{"text", primitive.Regex{Pattern: "he", Options: ""}}}
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 nslt的可用模型,或者其他可以进行推理的现有模型
  • ¥15 arduino上连sim900a实现连接mqtt服务器
  • ¥15 vncviewer7.0安装后如何正确注册License许可证,激活使用
  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并2
  • ¥66 关于人体营养与饮食规划的线性规划模型
  • ¥15 基于深度学习的快递面单识别系统
  • ¥15 Multisim仿真设计地铁到站提醒电路
  • ¥15 怎么用一个500W电源给5台60W的电脑供电
  • ¥15 请推荐一个轻量级规则引擎,配合流程引擎使用,规则引擎负责判断出符合规则的流程引擎模板id
  • ¥15 Excel表只有年月怎么计算年龄