mongo-driver go 内嵌数组操作
实体模型
import (
"go.mongodb.org/mongo-driver/bson/primitive"
)
type User struct {
Id primitive.ObjectID `bson:"_id"`
Ips []Ip `bson:"ips"`
Key string `bson:"key"`
}
type Ip struct {
Ip string `bson:"ip"`
}
var DalUser *mongo.Collection
1. 新增
func insert() {
user := new(dal.User)
user.Id = primitive.NewObjectID()
user.Ips = []dal.Ip{
{"127.0.0.1"},
{"127.0.0.2"},
{"127.0.0.3"},
}
user.Key = "test"
//新增
one, err := DalUser.InsertOne(ctx, user)
if err != nil {
return
}
fmt.Println("object id is ", one.InsertedID)
}
2. 查询
2.1. 查询内嵌数组包含某个值的数据集合
func findIp() {
//条件为:
//内嵌数组含有ip=127.0.0.4的数据
filter := bson.M{"ips": bson.M{"ip": "127.0.0.4"}}
d, err := DalUser.Find(ctx, filter)
if err != nil {
return
}
users := make([]dal.User, 0)
err = d.All(ctx, &users)
if err != nil {
panic(err)
return
}
fmt.Printf("查到了%d条", len(users))
}
2.2. 查询内嵌数组的第n项包含某个值的数据集合
func findOne() {
//条件为:
//内嵌数组的第一项 且 ip = 127.0.0.4
filter := bson.M{"ips.0": bson.M{"ip": "127.0.0.4"}}
d, err := DalUser.Find(ctx, filter)
if err != nil {
return
}
users := make([]dal.User, 0)
err = d.All(ctx, &users)
if err != nil {
panic(err)
return
}
fmt.Printf("查到了%d条 ", len(users))
}
3. 修改
3.1. 修改内嵌元素
func upIp() {
filter := bson.M{"key": "test"}
//修改内嵌数组的第一个元素的某个值
update := bson.M{"$set": bson.M{"ips.0": bson.M{"ip": "127.0.0.4"}}}
one, err := DalUser.UpdateOne(ctx, filter, update)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("修改了%d条", one.ModifiedCount)
}
3.2.向内嵌数组追加元素
func push() {
//过滤条件,决定需要向哪个user中追加元素
filter := bson.M{"key": "test"}
//构建要添加的项
ip := new(dal.Ip)
ip.Ip = "127.0.0.4"
//修改条件
update := bson.M{"$push": bson.M{"ips": ip}}
one, err := DalUser.UpdateOne(ctx, filter, update)
if err != nil {
return
}
fmt.Printf("修改了%d条", one.ModifiedCount)
}
3.3. 删除内嵌数组中的元素
func delIp() {
filter := bson.M{"key": "test"}
update := bson.M{"$pull": bson.M{"ips": bson.M{"ip": "127.0.0.4"}}}
one, err := DalUser.UpdateOne(ctx, filter, update)
if err != nil {
return
}
fmt.Printf("修改了%d条", one.ModifiedCount)
}