Files
mongo/update_set.go
2026-04-24 16:40:42 -04:00

71 lines
1.5 KiB
Go

package mongo
import (
"context"
"slices"
"go.mongodb.org/mongo-driver/v2/bson"
"git.gsuntres.com/general/commons"
)
// UpdateSet search documents using filter and updates the first it finds using the $set operator.
func (c *MongoClient) UpdateSet(ctx context.Context, database, name string, filter, original bson.M) (bool, error) {
collection := c.GetCollection(database, name)
data := commons.BsonClone(original)
prepareForUpdateSet(data)
if err := c.DiscriminatorCheckAndApplyToFilter(ctx, name, filter); err != nil {
return false, err
}
f := Mongofy(&Query{ Filter: filter })
if err := c.DiscriminatorOmitInData(name, data); err != nil {
return false, err
}
var found bson.M
if c.WithAudit {
if err := collection.FindOne(ctx, f).Decode(&found); err != nil {
return false, err
}
}
update := bson.M{ "$set": data }
updateResult, err := collection.UpdateOne(ctx, f, update)
if err != nil {
return false, err
}
changed := updateResult.ModifiedCount != 0
ignoreAudit := slices.Contains(c.IgnoreAudit, name)
if changed && c.WithAudit && !ignoreAudit {
var after bson.M
if err := collection.FindOne(ctx, f).Decode(&after); err != nil {
return false, err
}
contx := commons.ContextSerialize(ctx, c.ContextFields)
audit := &AuditResult {
Entity: name,
Op: OpUpdate,
Data: original,
Before: found,
After: after,
Context: contx,
}
(*c.OnAudit)(audit)
}
return changed, nil
}
func prepareForUpdateSet(data bson.M) {
ensureUpdatedAt(data)
}