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

时间:2019-11-20 23:28:15

标签: mongodb go mongodb-query

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

 {
  "_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数据

MongoDB data

仅状态将返回整个8k文档

bson.D{{"status","success"}}

不是collection.Find()函数适合它。

Shell命令正确返回文档

db.log.find({"status":"success","request_params.username":"test_user"}).limit(10).pretty()

1 个答案:

答案 0 :(得分:1)

这里的问题是由于查询过滤器。以下查询之间是有区别的:

// 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使用dot notation时,这意味着您要匹配request_params字段,其中 值为{"username":"test_user"}

有关更多信息,另请参见Query on Nested Field