英文:
How to delete Nth element in MongoDB array with golang?
问题
我需要删除expenses
中的第一个或第二个元素。
{
"_id": {"$oid": "12"},
"chatID": {"$numberInt": "12"},
"expenses": [
{"category": "food", "amount": {"$numberDouble": "12.0"}},
{"category": "food", "amount": {"$numberDouble": "14.0"}}
],
"income": []
}
类似于 expenses[0].Delete()
。
结果应该是这样的:
{
"_id": {"$oid": "12"},
"chatID": {"$numberInt": "12"},
"expenses": [
{"category": "food", "amount": {"$numberDouble": "14.0"}}
],
"income": []
}
英文:
I need to delete first or second element in expenses
{"_id":{"$oid":"12"},
"chatID":{"$numberInt":"12"},
"expenses":[
{"category":"food","amount":{"$numberDouble":"12.0"}},
{"category":"food","amount":{"$numberDouble":"14.0"}}],
"income":[]}
Smth like expenses[0].Delete()
Result should be like this:
{"_id":{"$oid":"12"},
"chatID":{"$numberInt":"12"},
"expenses":[
{"category":"food","amount":{"$numberDouble":"14.0"}}],
"income":[]}
答案1
得分: 1
你需要使用$unset
更新命令,并手动提及数组键名以及其索引。
更新命令:
_, err = collection.UpdateOne(
ctx,
bson.D{}, // <- 查找参数
bson.D{
{"$unset", bson.D{
{"expenses."+indexToRemove, 1}, // <- 从`expenses`数组中删除第`indexToRemove`个元素
}},
},
)
完整的Go代码:
package main
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"time"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
mClient, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
defer func() {
if err = mClient.Disconnect(ctx); err != nil {
panic(err)
}
}()
collection := mClient.Database("temp").Collection("tmp10")
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
var result bson.M
err = collection.FindOne(ctx, bson.D{}).Decode(&result)
fmt.Println(result)
indexToRemove := "0" // <- 输入要删除的索引,可以是字符串或将其转换为字符串
_, err = collection.UpdateOne(
ctx,
bson.D{},
bson.D{
{"$unset", bson.D{
{"expenses."+indexToRemove, 1}, // <- 从`expenses`数组中删除第`indexToRemove`个元素
}},
},
)
if err != nil {
fmt.Println(err)
}
err = collection.FindOne(ctx, bson.D{}).Decode(&result)
fmt.Println(result)
}
英文:
You have to make use of the $unset
update command and manually mention the array key name along with its index.
Update Command:
_, err = collection.UpdateOne(
ctx,
bson.D{}, // <- Find Parameter
bson.D{
{"$unset", bson.D{
{"expenses."+indexToRemove, 1}, // <- Removes `indexToRemove` th element from `expenses` array
}},
},
)
Full Go Code
package main
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"time"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
mClient, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
defer func() {
if err = mClient.Disconnect(ctx); err != nil {
panic(err)
}
}()
collection := mClient.Database("temp").Collection("tmp10")
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
var result bson.M
err = collection.FindOne(ctx, bson.D{}).Decode(&result)
fmt.Println(result)
indexToRemove := "0" // <- Input index to remove in string or convert it into string
_, err = collection.UpdateOne(
ctx,
bson.D{},
bson.D{
{"$unset", bson.D{
{"expenses."+indexToRemove, 1}, // <- Removes `indexToRemove` th element from `expenses` array
}},
},
)
if err != nil {
fmt.Println(err)
}
err = collection.FindOne(ctx, bson.D{}).Decode(&result)
fmt.Println(result)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论