go go.mongodb.org DeleteMany中$in的思考

背景

因为接到一个比较奇葩的需求,即使mongo中没有的集合也能批量删除成功

解决办法

想到了go.mongodb.org中的DeleteMany函数,因为这个函数自带过滤条件。本次支持多条件进行过滤,并且使用$in。

$in的思考

1、$in可以进行值匹配
2、$in可以之正则表达式进行匹配(在golang go.mongodb.org 不支持)

验证方式


/*
collectionName集合内容
{"_id":"dd"}
{"_id":"dc"}
{"_id":"db"}
{"_id":"de"}
*/
package main

import (
	"context"
	"log"
	"time"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

var client *mongo.Client

func init() {
	var err error
	client, err = setConnect("mongodb://127.0.0.1:27017")
	if err != nil {
		panic(err)
	}
	log.SetFlags(log.LUTC | log.Lshortfile | log.Ltime)
}

func setConnect(uri string) (*mongo.Client, error) {
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri).SetMaxPoolSize(20))
	if err != nil {
		return nil, err
	}
	// check
	if err = client.Ping(context.TODO(), nil); err != nil {
		return client, err
	}

	return client, nil
}

func DeleteMany() {
	col := client.Database("dbname").Collection("collectionName")
	findOptions := options.Find()
	cur, err := col.Find(context.Background(), bson.M{}, findOptions)
	if err != nil {
		log.Println(err)
		return
	}
	var data []interface{}
	err = cur.All(context.TODO(), &data)
	if err != nil {
		log.Println(err)
		return
	}
	deleteResult, err := col.DeleteMany(context.TODO(), bson.M{"_id": bson.M{"$in": []string{"dd"}}})
	if err != nil {
		log.Println(err)
		return
	}
	log.Println(deleteResult)
        deleteResult, err := col.DeleteMany(context.TODO(), bson.M{"_id": bson.M{"$in": []string{"^d"}}})
	if err != nil {
		log.Println(err)
		return
	}
	log.Println(deleteResult)
}

func main() {
	DeleteMany()
}

结果验证: ${1}、$

posted @ 2022-02-08 19:33  Myuniverse  阅读(607)  评论(0编辑  收藏  举报