【问题标题】:How to get full document from mongoDB with FindOne() function from the official MongoDB Go driver如何使用官方 MongoDB Go 驱动程序的 FindOne() 函数从 mongoDB 获取完整文档
【发布时间】:2019-06-14 03:13:42
【问题描述】:

我正在尝试从 MongoDB 获取单个文档并将其解码为包含切片的结构。 我使用官方的 MongoDB Go 驱动程序

我尝试过 collection.FindOne(),它返回除切片之外的所有内容,以及返回 EOF 的 collection.Find()

这是一个简单的 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"}}

没有 []*奖金[]*奖金支付, 但如果我打开终端,它会显示完整的结果

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,但这是一个不同的问题。 谢谢,所有试图提供帮助的人。

【问题讨论】:

  • 您能否通过editing it将 CLI 命令的输出添加到您的问题中?
  • 请同时添加 Bonus 和 BonusPayment 的类型定义。

标签: mongodb go


【解决方案1】:

我有一些使用旧社区驱动程序 (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"`
}

试一试,如果可行,请告诉我。

【讨论】:

  • 它现在带来空值:{ "id": "duma@mail.com", "user": { "id": "duma@mail.com", "firstName": "Comte", "lastName": "de La Fère", "email": "duma@mail.com" }, "bonus": null, "payments": null } 试图将数组放入用户 stract 但它是相同的:{ "id": "duma@mail.com", "user": { "id": "duma@mail.com", "firstName": "Comte", "lastName": "de La Fère", "email": "duma@mail.com", "bonus": null, "payments": null } }
猜你喜欢
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2020-05-08
  • 2011-05-21
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
相关资源
最近更新 更多