Mongo 过滤器在 mongo shell 内部工作,但在用 go 编写时不起作用
Mongo filter works inside the mongo shell but doesn't work when written in go
Mongo: 4.4
开始:1.17.3
我正在尝试获取字符串字段值超过四个符号的文档。
这是我在 mongo 的 shell:
中使用的查询
db.player.find({
"name": { "$exists": true },
"$expr": { "$gt": [ { "$strLenCP": "$name" }, 4 ] }
})
这是相同的查询,但在 go
中编码为 bson
过滤器:
longName := bson.M{
"name": bson.M{"$exists": true},
"$expr": bson.M{
"$gt": bson.A{
bson.M{"$strLenCP": "$name"},
4,
},
},
}
fmc, err := collection.Find(context.TODO(), longName)
if err != nil {
log.Panic(err)
}
var longBoi models.Player
err = fmc.Decode(&longBoi)
if err != nil {
log.Panic(err)
// panic here:
// 2021/12/15 15:53:46 EOF
// panic: EOF
}
第一个将输出字符串字段值长度超过一定数量的所需文档。第二个将仅显示 EOF
、时间戳和调用堆栈错误。调试器说 batch
inside coursor fmc
不包含任何数据。
第二种情况有什么问题?
以下解决了问题:
var longBoi []models.Player
err = fmc.All(context.TODO(), &longBoi)
if err != nil {
log.Panic(err)
}
Find()
returnsCursor()
,不是文件。然后可以使用游标通过调用 All()
或其他方法迭代匹配过滤器的文档。
Mongo: 4.4 开始:1.17.3
我正在尝试获取字符串字段值超过四个符号的文档。 这是我在 mongo 的 shell:
中使用的查询db.player.find({
"name": { "$exists": true },
"$expr": { "$gt": [ { "$strLenCP": "$name" }, 4 ] }
})
这是相同的查询,但在 go
中编码为 bson
过滤器:
longName := bson.M{
"name": bson.M{"$exists": true},
"$expr": bson.M{
"$gt": bson.A{
bson.M{"$strLenCP": "$name"},
4,
},
},
}
fmc, err := collection.Find(context.TODO(), longName)
if err != nil {
log.Panic(err)
}
var longBoi models.Player
err = fmc.Decode(&longBoi)
if err != nil {
log.Panic(err)
// panic here:
// 2021/12/15 15:53:46 EOF
// panic: EOF
}
第一个将输出字符串字段值长度超过一定数量的所需文档。第二个将仅显示 EOF
、时间戳和调用堆栈错误。调试器说 batch
inside coursor fmc
不包含任何数据。
第二种情况有什么问题?
以下解决了问题:
var longBoi []models.Player
err = fmc.All(context.TODO(), &longBoi)
if err != nil {
log.Panic(err)
}
Find()
returnsCursor()
,不是文件。然后可以使用游标通过调用 All()
或其他方法迭代匹配过滤器的文档。