Golang Пн go Драйвер Получить документы без схемы - PullRequest
0 голосов
/ 07 апреля 2020

При работе с драйвером Mon go Golang Я хочу получить документы без схемы.

Я могу получить документы, используя bson.M json:",inline" bson:",inline" Но это добавляет "M" введите json, когда я пытаюсь декодировать в структуру

type Product struct {
    ID        primitive.ObjectID `bson:"_id"`
    ProductId string `bson:"product_id" json:"product_id"`
    bson.M `json:",inline" bson:",inline"`
}

Вывод: -

{
 "id":"<ObjectId>",
 "M":{
    "some":""
  }
}

Но вместо того, что я хочу, как это хранится в пн go.

{
  "id":"<ObjectId>",
  "some":""
}

Я не могу напрямую использовать что-то подобное, так как хочу привести его к структуре для работы с некоторыми свойствами

var pr bson.M
err := p.FindOne(ctx, &p.options,query, &pr)

Как удалить этот дополнительный ключ, который получает добавлено при преобразовании документов без схемы из пн go?

Нужно ли явно перезаписывать маршала JSON () или что-то предусмотрено с помощью тегов?

1 Ответ

0 голосов
/ 08 апреля 2020

Как удалить тот дополнительный ключ, который добавляется при преобразовании документов без схемы из пн go?

Вы можете просто определить имя отображения поля, которое будет сглаживаться при ранжированы. Например:

type Product struct {
    ID          primitive.ObjectID      `bson:"_id"`
    ProductId   string                  `bson:"product_id"`
    Others      bson.M                  `bson:",inline"`
}

Когда вы декодируете документ, вы увидите, что он будет содержать другие поля без имени Others. Например, если у вас есть документ:

{
 "_id": ObjectId("5e8d330de85566f5a0557ea4"), 
 "product_id": "foo", 
 "some": "x", 
 "more": "y"
}
doc := Product{}
err = cur.Decode(&doc)
fmt.Println(doc)
// Outputs 
// {ObjectID("5e8d330de85566f5a0557ea4") foo map[more:y some:x]}

Я не могу использовать что-то подобное, так как хочу преобразовать его в struct для работы с некоторыми свойствами

Вы можете использовать это непосредственно для предиката запроса. Например:

// After decoding 'doc' to product
var result bson.M
err := collection.FindOne(context.TODO(), doc).Decode(&result)

Протестировано с использованием MongoDB Go драйвера v1.3.2

ОБНОВЛЕНО:

Если вы хотел бы вернуть JSON, вы можете использовать bson.MarshalExt JSON () . Это также должно быть проще с точки зрения работы с объектами, которых нет в JSON. т.е. ObjectId. Например:

// After decoding 'doc' to product
ejson, err := bson.MarshalExtJSON(doc, true, false)
fmt.Println(string(ejson)) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...