Сообщение об ошибке говорит само за себя: первый аргумент для встроенного delete()
должен быть значением типа карты stati c.
Ваша переменная result
имеет введите []interface{}
, поэтому его индексирование, например result[i]
, приведет к значению типа interface{}
.
Если он содержит карту, вы можете использовать утверждение типа для получения карты ценность от этого. Поскольку вы используете драйвер mgo
, он имеет тип bson.M
(то есть map[string]interface{}
), поэтому вы можете сделать это следующим образом:
delete(result[i].(bson.M), "_id")
Но это было бы лучше, если бы вы сначала объявили result
срезом карт:
var result []bson.M
Так что тогда утверждение типа не понадобится, и следующий код будет действительным:
delete(result[i], "_id")
Также обратите внимание, что если вы хотите удалить эти свойства из результатов, было бы лучше, если бы вы сказали MongoDB, что вам не нужны эти поля, и поэтому сервер даже не отправит их (сохраняя трафик сети). c) и тогда вам не придется их удалять (экономя время и память).
Используйте проекцию, чтобы сказать, что вам не нужны эти поля. В mgo
вы можете установить проекцию, используя метод Query.Select()
.
Например:
err := db.C(ORDERCOLLECTION).Find(nil).Select(bson.M{
"_id": 0,
"CreatedAt": 0,
"CreatedBy": 0,
"UpdatedAt": 0,
"UpdatedBy": 0,
}).All(&result)
Приведенный выше запрос приведет к документам, в которых перечислены поля не будут присутствовать, поэтому вам не нужно удалять их вручную, используя delete()
.