gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:17:03 25 4
gpt4 key购买 nike

查询以下数据时,返回的游标为空。而有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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com