mongo-driver go 内嵌数组操作

栾峰
2023-12-01

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)
}
 类似资料: