【问题标题】:Cannot get string values from a bson value无法从 bson 值获取字符串值
【发布时间】:2020-10-19 16:39:49
【问题描述】:

我正在做一个网站项目,我想从 mongo 数据库中的用户名中获取会话。我写了一个函数,它接受会话 uuid 并输出会话名称。我得到了会话并且可以在命令行中打印一个 bson。我正在尝试从 bson 获取字符串和浮点值,或者至少从 mongo golang 中的 bson 获取 json 值。下面是我用golang和mongodb go driver写的代码:

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "go.mongodb.org/mongo-driver/bson/primitive"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "golang.org/x/crypto/bcrypt"
    "gopkg.in/mgo.v2/bson"
)

type user struct {
    UserName string
    Password []byte
    First    string
    Last     string
    Role     string
}

type session struct {
    Id           bson.ObjectId `bson:"_id,omitempty"`
    Un           string        `json:"value"`
    LastActivity time.Time     `json:"value"`
    UUID         string        `json:"value"`
}
func main() {
    s := session{bson.NewObjectId(), "darkness", time.Now(), "1222"}
    insertSession(s)
    v := "1222"
    getSession(v)
}

func getSession(UUID string) {
    client, err := mongo.NewClient(options.Client().ApplyURI("mongodb+srv://lise:lise@cluster0.eouve.mongodb.net/userDatabase?retryWrites=true&w=majority"))
    if err != nil {
        log.Fatal(err)
    }
    ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
    err = client.Connect(ctx)
    if err != nil {
        log.Fatal(err)
    }
    defer client.Disconnect(ctx)
    sessionDatabase := client.Database("userDatabase")
    sessionCollection := sessionDatabase.Collection("sessionCollection")

    var sess []bson.M

    filter, err := sessionCollection.Find(ctx, bson.M{"uuid": UUID})
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(sess)

    //wantedSession := session{sessionMatched[0].un, sessionMatched[0].lastActivity, ,sessionMatched[0].uuid}
}



【问题讨论】:

  • Find 返回一个游标。您必须从该光标中读取数据才能获取数据。
  • @Burak Serdar 我应该使用 cursor.next() 从光标读取还是其他什么? (谢谢你的回答顺便说一句非常有帮助:))
  • 我了解如何获取游标,但我想将 bson 转换为字符串或 json 并获取会话的唯一用户名。我该如何实现它。谢谢你的回答顺便说一句

标签: json mongodb go bson


【解决方案1】:

find 的工作方式是返回一个 '*Cursor';要进一步从中获取数据,您可以做的是遍历光标并从中获取相关数据。

cur, err := coll.Find(ctx, bson.M{"uuid": UUID})
if err != nil {
    log.Fatal(err)
}
defer cur.Close(context.TODO())
for cur.Next(context.TODO()) {
    var result bson.M
    err := cur.Decode(&result)
    if err != nil {
        log.Fatal(err)
    }
}
if err := cur.Err(); err != nil {
    log.Fatal(err)
}

如果 Find 查询仅返回单个值,使用简单脚本,然后进行编组,如下所示:

 cur.Next(context.TODO())
 var result bson.M
 err := cur.Decode(&result)
 if err != nil {
    log.Fatal(err)
 }

【讨论】:

  • 我了解如何获取游标,但我想将 bson 转换为字符串或 json 并获取会话的唯一用户名。我该如何实现它。谢谢你的回答顺便说一句
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多