在查询以下数据时,返回的游标为空。而有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数据
仅状态将返回整个8k文档
bson.D{{"status","success"}}
不是collection.Find()函数适合它。
Shell命令正确返回文档
db.log.find({"status":"success","request_params.username":"test_user"}).limit(10).pretty()
答案 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。