Go语言 蒙古DB戈兰:带有嵌套Bson.M的FindOne()尝试10%失败,Bson.M+Bson.D或单个Bson.M始终有效,为什么?

eit6fx6z  于 2023-01-28  发布在  Go
关注(0)|答案(1)|浏览(201)

需要一些帮助来找出嵌套的bson.M在FindOne()中有时不起作用的原因。
对于存储在MongoDb集合中的A类型Golang结构体:

type A struct {
 Id       primitive.ObjectID 
 Random1  string
 Parents  []B
 Random2  int
}

type B struct {
 Id       primitive.ObjectID 
 Random3  string
 Children []C
 Random4  int
}

type C struct {
 Random5  string
 Name     Name
 Random6  int
}

type Name struct {
  FirstName string
  LastName string
}

FindOne()的以下筛选器使用两个bson.M,在大多数情况下都能正常工作,但在大约10%的运行中找不到匹配项

filter1 := bson.M{
        "parents.0.chilren.0.name": bson.M{
            "first_name":  "Mike",
            "last_name": "Anderson",
        },
}

以下两个过滤器始终有效,其中过滤器2使用bson.M中的bson.D,过滤器3仅使用一个bson.M

filter2 := bson.M{
        "parents.0.chilren.0.name": bson.D{
            {Key: "first_name",  Value: "Mike"},
            {Key: "last_name",  Value: "Anderson"},
        },
}

filter3 := bson.M{
        "parents.0.chilren.0.name.first_name":  "Mike",
        "parents.0.chilren.0.name.last_name":  "Anderson",
}

我在https://jira.mongodb.org/browse/GODRIVER-877中发现了一个类似的问题,但仍然不明白差异或根本原因。感谢帮助!

vuktfyat

vuktfyat1#

bson.M是一个Map,因此,其元素的顺序无法保证。由于您要比较的是parents.0.chilren.0.name,它是一个结构,因此搜索条件必须完全匹配,条件中的字段顺序必须与数据库中的顺序字段匹配。这就是使用bson.M时,有时匹配,有时不匹配的原因。当搜索条件与数据库字段顺序匹配时,你会得到结果,否则你就得不到
这就是bson.D条件总是匹配的原因,因为它基于切片,所以字段的顺序保持不变。
最后一个搜索条件比较单个字段,而不是结构,因此字段的顺序是不重要的。

相关问题