Mongo: 4.4 Ir: 1.17.3
Estoy tratando de obtener documentos con un valor de campo de cadena de más de cuatro símbolos. Aquí está la consulta que uso dentro del shell de mongo:
db.player.find({ "name": { "$exists": true }, "$expr": { "$gt": [ { "$strLenCP": "$name" }, 4 ] } }) Y aquí está la misma consulta pero codificada como filtro bson en go :
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 } El primero generará los documentos deseados con una longitud de valor de campo de cadena superior a cierto número. El segundo generará un error con solo EOF , marca de tiempo y pila de llamadas. El depurador dice que el batch dentro del cursor fmc no contiene datos.
¿Qué hay de malo en el segundo caso?
Lo siguiente soluciona el problema:
var longBoi []models.Player err = fmc.All(context.TODO(), &longBoi) if err != nil { log.Panic(err) } Find() devuelve el Cursor() , no los documentos. Luego, el cursor se puede usar para iterar sobre documentos que coincidan con el filtro llamando a All() o algún otro método.