如何使用 mongo-driver/mongo 查找具有多个条件的文档

查询以下数据时,返回的游标为空。而满足条件的文档有上百个。


 {

  "_id": "5dd68c51a39809125944ffba",

  "status": "success",

  "balance": "0.000",

  "request_params": {

   "username": "test_user",

   "service_code": "MR"

 }

使用下面的代码


MongoDB 驱动程序“go.mongodb.org/mongo-driver/mongo”


func saveLog(data Log) bool {

    mongo, err := openMongo()

    if err != nil {

        log.Println(err)

        fmt.Println("Connection failed")

        return false

    } else {

        LogCollection := mongo.Database(LogDb).Collection(CollectionLog)

        insertedApi, err := LogCollection.InsertOne(context.TODO(), data)

        if err != nil {

            log.Println(err)

            fmt.Println("Insert failed")

            return false

        } else {

            log.Println(insertedApi.InsertedID)

            return true

        }

    }

}


func parseLog() {

    db, err := openMongo()

    if err != nil {

        fmt.Println(err)

        fmt.Println("Connection failed")

        return

    } else {

        logCollection := db.Database(LogDb).Collection(CollectionLog)

        var results [] *Log

        find := bson.D{{"status","success"},{"request_params",bson.D{{"username","test_user"}}}}

        fmt.Println(find)

        cur, err := logCollection.Find(context.TODO(), find)

        if err != nil {

            log.Fatal(err)

        }else {

            for cur.Next(context.TODO()) {

                var elem Log

                err := cur.Decode(&elem)

                if err != nil {

                    fmt.Println("Parse error : ",err)

                }

                fmt.Println("Log : ",elem)

                results = append(results, &elem)

            }

        }

    }

}

日志写入


saveLog(Log{"success","0.000",RequestParams{"test_user","MR"}})

日志读取


parseLog()

日志结构


type Log struct {

    Status string `bson:"status"`

    Balance string `bson:"balance"`

    RequestParams RequestParams `bson:"request_params"`

}

type RequestParams struct {

    Username string `bson:"username"`

    ServiceCode     string `bson:"service_code"`

}

MongoDB 数据

https://img2.mukewang.com/64d061070001dfdc04970345.jpg

慕后森
浏览 70回答 1
1回答

慕尼黑5688855

这里的问题是由于查询过滤器造成的。以下查询之间存在差异:// Query A: {"status": "success", "request_params": {"username":"test_user"}}find := bson.D{{"status","success"},{"request_params",bson.D{{"username","test_user"}}}}// Query B: {"status": "success", "request_params.username":"test_user"}find := bson.D{{"status","success"},{"request_params.username","test_user"}}查询 A 意味着您希望匹配request_params值对象完全等于 的精确文档{"username":"test_user"}。您的收藏中没有任何文档符合此条件。该文档还包含{"service_code":"MR"}. 而查询 B 使用点表示法,这意味着您希望匹配包含值 的request_params字段。{"username":"test_user"}
打开App,查看更多内容
随时随地看视频慕课网APP