需要一些帮助来找出嵌套的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中发现了一个类似的问题,但仍然不明白差异或根本原因。感谢帮助!
1条答案
按热度按时间vuktfyat1#
bson.M
是一个Map,因此,其元素的顺序无法保证。由于您要比较的是parents.0.chilren.0.name
,它是一个结构,因此搜索条件必须完全匹配,条件中的字段顺序必须与数据库中的顺序字段匹配。这就是使用bson.M
时,有时匹配,有时不匹配的原因。当搜索条件与数据库字段顺序匹配时,你会得到结果,否则你就得不到这就是
bson.D
条件总是匹配的原因,因为它基于切片,所以字段的顺序保持不变。最后一个搜索条件比较单个字段,而不是结构,因此字段的顺序是不重要的。