Golang MongoDB с использованием оператора $ in в списке - аргумент результата должен быть адресом фрагмента - PullRequest
1 голос
/ 09 июля 2020

У меня есть следующий запрос Mon go, который я пытаюсь преобразовать в Go, используя github.com/globalsign/mgo:

db.getCollection('cluster').find({"clusterName": {"$in": ["clusterA", "clusterB"]}})

"clusterName" - это строковое поле. По сути, наивной альтернативой было бы выполнить несколько вызовов mon go для каждого значения в списке.

Запрос, который я написал:

func ReadClusters(clusterNames []string) (*[]kusto.Cluster, error) {
    var clusters *[]kusto.Cluster
    err := readObjects(clusterCollection, bson.M{"clusterName": bson.M{"$in": clusterNames}}, &clusters, "" /* sortField */)
    if err != nil {
        return nil, err
    }

    return clusters, nil
}

И мои вспомогательные функции:

func readObjects(collection string, query bson.M, dest interface{}, sortField string) error {
    err := getDocuments(collection, query, dest, sortField)
    if err != nil {
        if err == mgo.ErrNotFound {
            return ErrNotFound
        }
        return err
    }

    return nil
}

func getDocuments(collectionName string, query bson.M, dest interface{}, sortField string) error {
    session := client.Copy()
    defer session.Close()

    collection := getCollection(session, collectionName)
    find := collection.Find(query)

    if sortField != "" {
        find = find.Sort(sortField)
    }

    return find.All(dest)
}

Я получаю сообщение об ошибке:

2020/07/09 11:58:46 http: pani c serve [:: 1]: 54085: аргумент результата должен быть быть адресом фрагмента

Сейчас я использую Go1.11, а версия m go, которую я вижу под go.mod, это github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8

1 Ответ

3 голосов
/ 09 июля 2020

clusters уже имеет тип указателя на срез, поэтому его адрес будет указателем на указатель на срез.

Объявить, что это не указатель на срез:

var clusters []kusto.Cluster
...