mongo-driver go 内嵌数组操作

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)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值