来自MongoDB的alpha驱动程序的简单CRUD示例

时间:2018-05-15 09:22:17

标签: mongodb go

我想从MongoDB测试Golang MongoDB驱动程序 (https://github.com/mongodb/mongo-go-driver,目前处于alpha状态)。

包文档中的示例(https://godoc.org/github.com/mongodb/mongo-go-driver/mongo)对我没什么帮助。我正在寻找的是基本CRUD操作的简单(但完整)示例。

3 个答案:

答案 0 :(得分:5)

@Stennie:谢谢您的详细解释。我已经看过上面提到的例子了,但是他们看起来水平很低而且对我来说不是惯用语。所以我想到了这个:

// Size defines the item size
type Size struct {
    H   int
    W   float64
    Uom string
}

// Item defines an item
type Item struct {
    OID  objectid.ObjectID `bson:"_id,omitempty"` // omitempty not working
    Item string
    Qty  int
    Tags []string
    Size Size
}

func main() {
    // connect to MongoDB
    client, err := mongo.Connect(context.Background(), "mongodb://localhost:27017", nil)
    if err != nil {
        log.Fatal(err)
    }
    db := client.Database("mongosample")
    inventory := db.Collection("inventory")

    // write document
    itemWrite := Item{Item: "canvas", Qty: 100, Tags: []string{"cotton"}, Size: Size{H: 28, W: 35.5, Uom: "cm"}}
    itemWrite.OID = objectid.New()
    fmt.Printf("itemWrite = %v\n", itemWrite)

    result, err := inventory.InsertOne(context.Background(), itemWrite)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("result = %#v\n", result)

    // read documents
    cursor, err := inventory.Find(
        context.Background(),
        bson.NewDocument(bson.EC.String("item", "canvas")),
    )
    if err != nil {
        log.Fatal(err)
    }
    defer cursor.Close(context.Background())

    itemRead := Item{}
    for cursor.Next(context.Background()) {
        err := cursor.Decode(&itemRead)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("itemRead = %v\n", itemRead)
    }
}

我不需要控制应用程序中的ObjectID,并且希望让驱动程序或数据库按需生成ID。问题在这里:我找不到省略ID的方法。这bson:"_id,omitempty"不起作用。它将所有内容设置为0并且#ID;对象ID(" 000000000000000000000000")'提供给OID。也许是一个普遍问题,因为ObjectID是一个数组而不是切片:类型ObjectID [12] byte

答案 1 :(得分:1)

由于MongoDB Go驱动程序目前是alpha版本,因此文档仍在处理中。但是,您可以在驱动程序的GitHub存储库中找到用于文档的示例:examples/documentation_examples/examples.go。在同一目录(examples-test.go)中还有一个测试工具,以确保所有代码示例按预期工作。

如果您在examples.go搜索// Start Example,则可以找到与匹配的// End Example划分的代码段。示例的编号有些不透明,但实际上这些是用于提取MongoDB手册的驱动程序代码片段的标准引用。

特别是,初始代码示例应与手册MongoDB CRUD Operations部分中的选项卡代码块匹配。

使用examples.go中的func InsertExamples()来说明:

在大多数情况下,代码示例的顺序应遵循文档中代码块的顺序。

答案 2 :(得分:0)

我在最近的项目中编写了这样的代码,并且效果很好。请您尝试一下。

仅供参考:我使用的是官方的Go-Mongo DB driver

import "go.mongodb.org/mongo-driver/bson/primitive"

type Item struct {

    OID  primitive.ObjectID `json:"id,omitempty" bson:"_id,omitempty"`
    Item string
    Qty  int
    Tags []string
    Size Size
}