[js go]用go操作mongodb

535 阅读1分钟

安装好mongodb后咱们就可以用go来操作mongodb, 进行快乐的CRUD了

安装mogodb驱动

$ go get github.com/mongodb/mongo-go-driver 

连接mongodb

	// 设置客户端连接配置
	clientOptions := options.Client().ApplyURI("mongodb://user:pwd@server:port/db")

	// 连接到MongoDB
	client, err := mongo.Connect(context.TODO(), clientOptions)
	if err != nil {
		log.Fatal(err)
	} else {
		fmt.Printf("client %#v \n", client) // client &mongo.Client{...}
	}

检查连接

	// 检查连接
	err = client.Ping(context.TODO(), nil)
	if err != nil {
		log.Fatal(err)
	} else {
		fmt.Println("Connected to MongoDB!")
	}

连接数据集

相当于mysql中的table

	// 数据集
	collection := client.Database("db").Collection("coder")
	fmt.Printf("collection %#v \n", collection) // collection &mongo.Collection{...}

增加一行文档

相当于js的db.coder.insertOne({})

	s1 := Coder{"写代码的老哥0", 35}
	insertResult, err := collection.InsertOne(context.TODO(), s1)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Inserted a single document: ", insertResult.InsertedID) // ObjectID("5fe81819be51c1175cd95ba3")

用Robo 3T查看

增加多行文档

相当于js的db.coder.insertMany([...])

	// 插入多个
      	s2 := Coder{"写代码的老哥1", 36}
	s3 := Coder{"写代码的老哥2", 37}
	coders := []interface{}{s2, s3}
	insertManyResult, err := collection.InsertMany(context.TODO(), coders)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs) // Inserted multiple documents:  [ObjectID("5fe818a70bb1cc7b7b030fe7") ObjectID("5fe818a70bb1cc7b7b030fe8")]

查找一个

相当于js的bd.coder.find(filter)

	filter := bson.D{{"name", "写代码的老哥0"}}
	var result Coder
	err = collection.FindOne(context.TODO(), filter).Decode(&result)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Found a single document: %+v\n", result)

查找多个

相当于js的db.coder.find()

	// 查询多个
	// 将选项传递给Find()
	findOptions := options.Find()
	findOptions.SetLimit(2)

	// 定义一个切片用来存储查询结果
	var results []*Coder

	// 把bson.D{{}}作为一个filter来匹配所有文档
	cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
	if err != nil {
		log.Fatal(err)
	}

	// 查找多个文档返回一个游标
	// 遍历游标允许我们一次解码一个文档
	for cur.Next(context.TODO()) {
		// 创建一个值,将单个文档解码为该值
		var elem Coder
		err := cur.Decode(&elem)
		if err != nil {
			log.Fatal(err)
		}
		results = append(results, &elem)
	}

	if err := cur.Err(); err != nil {
		log.Fatal(err)
	}

	// 完成后关闭游标
	cur.Close(context.TODO())

	fmt.Printf("Found multiple documents (array of pointers): %#v\n", results)

	for index, coder := range results {
		fmt.Printf("coder %v name %v age %v \n", index, coder.Name, coder.Age)
	}

更新

相当于js的db.coder.update(...)

	// 查找过滤
	filter := bson.D{{"name", "写代码的老哥0"}}
	// 更新
	update := bson.D{
		{"$inc", bson.D{
			{"age", 1},
		}},
	}
	updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Matched %v documents and updated %v documents. \n", updateResult.MatchedCount, updateResult.ModifiedCount)

删除一个

相当于js的db.coder.deleteOne(...)

	deleteResult1, err := collection.DeleteOne(context.TODO(), bson.D{{"name","写代码的老哥0"}})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Deleted %v documents in the collection\n", deleteResult1.DeletedCount)

删除多个

相当于js的db.coder.drop()

	// 删除所有
	deleteResult2, err := collection.DeleteMany(context.TODO(), bson.D{{}})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Deleted %v documents in the collection\n", deleteResult2.DeletedCount)