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}、$