Skip to content

Commit 19f1bba

Browse files
authored
feat: add upsert one in bulk (#256)
1 parent 06f8aaf commit 19f1bba

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

bulk.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,14 @@ func (b *Bulk) Upsert(filter interface{}, replacement interface{}) *Bulk {
118118
return b
119119
}
120120

121+
// UpsertOne queues an UpsertOne operation for bulk execution.
122+
// The update should contain operator
123+
func (b *Bulk) UpsertOne(filter interface{}, update interface{}) *Bulk {
124+
wm := mongo.NewUpdateOneModel().SetFilter(filter).SetUpdate(update).SetUpsert(true)
125+
b.queue = append(b.queue, wm)
126+
return b
127+
}
128+
121129
// UpsertId queues an UpsertId operation for bulk execution.
122130
// The replacement should be document without operator
123131
func (b *Bulk) UpsertId(id interface{}, replacement interface{}) *Bulk {

bulk_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,23 @@ func TestBulk(t *testing.T) {
4141
ast.Equal(int64(4), result.MatchedCount)
4242

4343
}
44+
45+
func TestBulkUpsertOne(t *testing.T) {
46+
ast := require.New(t)
47+
cli := initClient("test")
48+
defer cli.Close(context.Background())
49+
defer cli.DropCollection(context.Background())
50+
51+
result, err := cli.Bulk().
52+
UpsertOne(bson.M{"name": "Jess"}, bson.M{operator.Set: bson.M{"age": 20}, operator.SetOnInsert: bson.M{"weight": 40}}).
53+
UpsertOne(bson.M{"name": "Jess"}, bson.M{operator.Set: bson.M{"age": 30}, operator.SetOnInsert: bson.M{"weight": 40}}).
54+
Run(context.Background())
55+
56+
ast.NoError(err)
57+
ast.Equal(int64(0), result.InsertedCount)
58+
ast.Equal(int64(1), result.ModifiedCount)
59+
ast.Equal(int64(0), result.DeletedCount)
60+
ast.Equal(int64(1), result.UpsertedCount)
61+
ast.Equal(1, len(result.UpsertedIDs))
62+
ast.Equal(int64(1), result.MatchedCount)
63+
}

0 commit comments

Comments
 (0)