我正在尝试从 MongoDB 获取单个文档,并将其解码为包含切片的结构。 我使用官方的MongoDB Go驱动程序。
我尝试了 collection.FindOne(),它返回除切片以外的所有内容,以及 collection.Find(),其返回EOF。
这是一个简单的FindOne()函数:
func FindOne(c *mongo.Collection, filter, result interface{}, opts ...*options.FindOneOptions) error {
err := c.FindOne(context.TODO(), filter, opts...).Decode(result)
if err != nil {
return err
}
return nil
}
我正在尝试将结果解码为结构:
type UserBonus struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"`
Bonus []*Bonus `protobuf:"bytes,3,rep,name=bonus,proto3" json:"bonus,omitempty"`
Payments []*BonusPayment `protobuf:"bytes,4,rep,name=payments,proto3" json:"payments,omitempty"`
}
type Bonus struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
DueDate int64 `protobuf:"varint,2,opt,name=dueDate,proto3" json:"dueDate,omitempty"`
CancelDate int64 `protobuf:"varint,3,opt,name=cancelDate,proto3" json:"cancelDate,omitempty"`
LastUpdate int64 `protobuf:"varint,4,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"`
Amount float32 `protobuf:"fixed32,5,opt,name=amount,proto3" json:"amount,omitempty"`
}
type BonusPayment struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
ProductId int64 `protobuf:"varint,2,opt,name=productId,proto3" json:"productId,omitempty"`
Amount float32 `protobuf:"fixed32,3,opt,name=amount,proto3" json:"amount,omitempty"`
CreateDate int64 `protobuf:"varint,4,opt,name=createDate,proto3" json:"createDate,omitempty"`
CancelDate int64 `protobuf:"varint,5,opt,name=cancelDate,proto3" json:"cancelDate,omitempty"`
LastUpdate int64 `protobuf:"varint,6,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"`
}
col := mng.GetCollection(db, "bonus")
filter := bson.M{"id":"duma@mail.com"}
var result pb.UserBonus
err = mng.FindOne(col, filter, &result)
但是结果是
{"id":"duma@mail.com","user":{"id":"duma@mail.com","firstName":"Comte","lastName":"de La Fère","email":"duma@mail.com"}}
无 [] *奖金 和 [] * BonusPayment , 但是如果我打开终端,它将显示完整的结果
db.bonus.findOne({"id":"duma@mail.com"})
{
"_id" : ObjectId("5d030aadf464d3397c73ec32"),
"id" : "duma@mail.com",
"user" : {
"id" : "duma@mail.com",
"firstname" : "Comte",
"lastname" : "de La Fère",
"email" : "duma@mail.com",
"balance" : 134.5999984741211
},
"bonus" : [
{
"id" : "",
"duedate" : NumberLong(1560480429),
"canceldate" : NumberLong(0),
"lastupdate" : NumberLong(1560480429),
"amount" : 50
},
{
"createDate" : NumberLong(1560480429),
"lastUpdate" : NumberLong(1560480429),
"amount" : 34.5
}
],
"lastbonusid" : NumberLong(0),
"payments" : [
{
"id" : "",
"productid" : NumberLong(1),
"amount" : 10,
"createdate" : NumberLong(0),
"canceldate" : NumberLong(0),
"lastupdate" : NumberLong(0)
}
]
}
发现了问题。 如果我在插入后运行更新查询
update := bson.M{
"$inc": bson.M{"user.balance": input.Bonus.Amount},
}
它不再带来数组和user.balance,但这是另一个问题。 谢谢,每个尝试帮助的人。
答案 0 :(得分:0)
我有一些使用旧社区驱动程序(mgo)的项目,而我遇到了这个问题。我的解决方案是在Struct的字段中添加标签“ bson”。
type UserBonus struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"`
Bonus []*Bonus `protobuf:"bytes,3,rep,name=bonus,proto3" json:"bonus,omitempty" bson:"bonus,omitempty"`
Payments []*BonusPayment `protobuf:"bytes,4,rep,name=payments,proto3" json:"payments,omitempty" bson:"payments,omitempty"`
}
type Bonus struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
DueDate int64 `protobuf:"varint,2,opt,name=dueDate,proto3" json:"dueDate,omitempty"`
CancelDate int64 `protobuf:"varint,3,opt,name=cancelDate,proto3" json:"cancelDate,omitempty"`
LastUpdate int64 `protobuf:"varint,4,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"`
Amount float32 `protobuf:"fixed32,5,opt,name=amount,proto3" json:"amount,omitempty"`
}
type BonusPayment struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
ProductId int64 `protobuf:"varint,2,opt,name=productId,proto3" json:"productId,omitempty"`
Amount float32 `protobuf:"fixed32,3,opt,name=amount,proto3" json:"amount,omitempty"`
CreateDate int64 `protobuf:"varint,4,opt,name=createDate,proto3" json:"createDate,omitempty"`
CancelDate int64 `protobuf:"varint,5,opt,name=cancelDate,proto3" json:"cancelDate,omitempty"`
LastUpdate int64 `protobuf:"varint,6,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"`
}
尝试一下,让我知道是否可行。