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() 或其他方法迭代匹配过滤器的文档。