i have been trying to update like and disliked to primitive.ObjectID
but i keep getting error like "write exception: write errors: [Cannot apply $pull to a non-array value]"
or "error decoding key disliked: cannot decode document into []primitive.ObjectID"
i dont even know what is wrong with my code, i think everything is right, but error keep coming up
code
func (f *ForumServiceImpl) LikedAPost(postId string, userId string) (*model.Forum, int64, error) {
postObjectId, err := primitive.ObjectIDFromHex(postId)
if err != nil {
return nil, 0, err
}
userObjectId, err := primitive.ObjectIDFromHex(userId)
if err != nil {
return nil, 0, err
}
// Find the post
filter := bson.M{"_id": postObjectId}
var forum model.Forum
err = f.forumCollection.FindOne(context.TODO(), filter).Decode(&forum)
if err != nil {
return nil, 0, err
}
// 1. Ensure that both 'liked' and 'disliked' are arrays
ensureArrayFields := bson.M{
"$set": bson.M{
"liked": bson.M{
"$ifNull": []interface{}{"$liked", primitive.A{}}, // Set 'liked' to an empty array if null
},
"disliked": bson.M{
"$ifNull": []interface{}{"$disliked", primitive.A{}}, // Set 'disliked' to an empty array if null
},
},
}
// Apply the update to ensure 'liked' and 'disliked' are arrays
_, err = f.forumCollection.UpdateOne(context.TODO(), filter, ensureArrayFields)
if err != nil {
return nil, 0, err
}
// 2. Perform the $addToSet for 'liked' and $pull for 'disliked'
update := bson.M{
"$addToSet": bson.M{"liked": userObjectId}, // Add userId to 'liked' array
"$pull": bson.M{"disliked": userObjectId}, // Remove userId from 'disliked' array
}
result, err := f.forumCollection.UpdateOne(context.TODO(), filter, update)
if err != nil {
return nil, 0, err
}
// Retrieve the updated post
err = f.forumCollection.FindOne(context.TODO(), filter).Decode(&forum)
if err != nil {
return nil, 0, err
}
return &forum, result.ModifiedCount, nil
}
the model
type Forum struct {
Id primitive.ObjectID `form:"id" bson:"_id,omitempty" swaggerignore:"true"`
Name string `form:"name" bson:"name" binding:"required"`
Title string `form:"title" bson:"title" binding:"required"`
Createdby primitive.ObjectID `form:"createdby" bson:"createdby" swaggerignore:"true"`
// @swagger.property (type: array, items: &swagger.Schema{type: string, or: &swagger.Schema{type: file}})
Images []string `form:"images" bson:"images" swaggerignore:"true"`
File []*multipart.FileHeader `form:"file" bson:"file" binding:"required"`
Description string `form:"description" bson:"description" binding:"required"`
QuoteData string `form:"quoteData" bson:"quoteData,omitempty" swaggerignore:"true"`
Quote bool `form:"quote" bson:"quote" default:"false"`
Private bool `form:"private" bson:"private" default:"false" example:"false"`
Category string `form:"category" bson:"category,omitempty"`
SubCategory string `form:"subcategory" bson:"subcategory,omitempty"`
Liked []primitive.ObjectID `form:"liked" bson:"liked" default:"[]"`
Disliked []primitive.ObjectID `form:"disliked" bson:"disliked" default:"[]"`
SecretCode string `form:"secretCode" bson:"secretCode"`
Hashtag []string `form:"hashtag" bson:"hashtag"`
Incognito bool `form:"incognito" bson:"incognito" default:"true" example:"true"`
Fellowing []string `form:"fellowing" bson:"fellowing"`
Views string `form:"views" bson:"views,omitempty" swaggerignore:"true"`
Pool bool `form:"pool" default:"false" bson:"pool"`
CreateAt time.Time `form:"createAt" gorm:"autoCreateTime" bson:"createAt" swaggerignore:"true"`
UpdatedAt time.Time `form:"updatedAt" gorm:"autoUpdateTime" bson:"updatedAt" swaggerignore:"true"`
}
3