Как отфильтровать поля из документа монго с официальным драйвером mongo-go - PullRequest
0 голосов
/ 02 ноября 2018

Как я могу отфильтровать поля с помощью mongo-go-driver. Пробовал с findopt.Projection, но безуспешно.

type fields struct {
    _id int16
}

s := bson.NewDocument()
filter := bson.NewDocument(bson.EC.ObjectID("_id", starterId))

var opts []findopt.One
opts = append(opts, findopt.Projection(fields{
    _id: 0,
}))

staCon.collection.FindOne(nil, filter, opts...).Decode(s)

В конце я хочу подавить поле "_id". Но документы не изменились.

1 Ответ

0 голосов
/ 05 ноября 2018

Причина, по которой оно не работает для вас, заключается в том, что поле fields._id не экспортируется, и поэтому никакой другой пакет не может получить к нему доступ (только декларирующий пакет).

Вы должны использовать экспортируемое имя поля (начинается с заглавной буквы), например ID и используйте теги struct , чтобы сопоставить его с полем MongoDB _id следующим образом:

type fields struct {
    ID int `bson:"_id"`
}

А теперь для выполнения запроса с использованием проекции:

projection := fields{
    ID: 0,
}
result := staCon.collection.FindOne(
    nil, filter, options.FindOne().SetProjection(projection)).Decode(s)

Обратите внимание, что вы также можете использовать bson.Document в качестве проекции, вам не нужен ваш собственный тип структуры. Например. следующее делает то же самое:

projection := bson.NewDocument(
    bson.EC.Int32("_id", 0),
)
result := staCon.collection.FindOne(
    nil, filter, options.FindOne().SetProjection(projection)).Decode(s)
...