我想从MongoDB测试Golang MongoDB驱动程序 (https://github.com/mongodb/mongo-go-driver,目前处于alpha状态)。
包文档中的示例(https://godoc.org/github.com/mongodb/mongo-go-driver/mongo)对我没什么帮助。我正在寻找的是基本CRUD操作的简单(但完整)示例。
答案 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()
来说明:
Insert Documents教程使用此函数中的示例。
Example 2是find()
查询,用于检索刚刚插入的文档。
在大多数情况下,代码示例的顺序应遵循文档中代码块的顺序。
答案 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
}