my document:
{
"_id" : ObjectId("60784451b5d2b589bcb138e8"),
"regions" : [
{
"name" : "us-east-1",
"steps" : [
{
"name" : "step0",
"number" : 0,
"completed" : false,
"successful" : false,
"message" : ""
},
{
"name" : "step1",
"number" : 1,
"completed" : false,
"successful" : false,
"message" : ""
}
]
},
{
"name" : "us-west-2",
"steps" : [
{
"name" : "step0",
"number" : 0,
"completed" : false,
"successful" : false,
"message" : ""
},
{
"name" : "step1",
"number" : 1,
"completed" : false,
"successful" : false,
"message" : ""
}
]
}
]
}
What I wanted to do: update the particular step of a particular region.
golang code snipet:
func UpdateStep(id string, step *Step) bool {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
collection := config.Singleton().Database.Collection("deploys")
objID, _ := primitive.ObjectIDFromHex(id)
filter := options.ArrayFilters{
Filters: bson.A{bson.M{"_id": objID}, bson.M{"x.name": step.Region}, bson.M{"y.name": step.Name}}}
opts := options.Update().SetUpsert(false)
update := bson.M{
"$set": bson.M{
"regions.$[x].steps.$[y].completed": step.Completed,
"regions.$[x].steps.$[y].successful": step.Successful,
},
}
ret, err := collection.UpdateOne(ctx, filter, update, opts)
if err != nil {
return false
}
return true
}
Got error when ran:
multiple write errors: [{write errors: [{No array filter found for identifier ‘x’ in path ‘regions.[x].steps.[y].completed’}]}, {}]
Any help is greatly appreciated.