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

标签 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()

最佳答案

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

// 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

关于mongodb - 如何使用mongo-driver/mongo查找具有多种条件的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58964972/

相关文章:

mongodb - 从 mongo db $pull 中删除嵌入文档不起作用

mongodb - Mongoose 查询使用 if else possible?

arrays - 根据元素的位置删除mongoDB中的数组元素

go - 通过 Jenkins 工具安装 go-1.17 时输入格式错误或输入包含不可映射的字符

templates - 从go html模板中的父对象访问变量

node.js - 为什么 MongoDB Cursor.maxTimeMS 不起作用?

mongodb - 使用 NoRM for MongoDB 中的 HiLoIdGenerator 创建唯一标识符

heroku - 在 Heroku 上部署 Go 应用程序后遇到问题

mongodb : Query array of nested string

python - Mongo Aggregate 所有文档的字典列表中值的总和