306 lines
12 KiB
Go
306 lines
12 KiB
Go
// Copyright (C) MongoDB, Inc. 2017-present.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
// not use this file except in compliance with the License. You may obtain
|
|
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
package mongo
|
|
|
|
import (
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
// WriteModel is an interface implemented by models that can be used in a BulkWrite operation. Each WriteModel
|
|
// represents a write.
|
|
//
|
|
// This interface is implemented by InsertOneModel, DeleteOneModel, DeleteManyModel, ReplaceOneModel, UpdateOneModel,
|
|
// and UpdateManyModel. Custom implementations of this interface must not be used.
|
|
type WriteModel interface {
|
|
writeModel()
|
|
}
|
|
|
|
// InsertOneModel is used to insert a single document in a BulkWrite operation.
|
|
type InsertOneModel struct {
|
|
Document interface{}
|
|
}
|
|
|
|
// NewInsertOneModel creates a new InsertOneModel.
|
|
func NewInsertOneModel() *InsertOneModel {
|
|
return &InsertOneModel{}
|
|
}
|
|
|
|
// SetDocument specifies the document to be inserted. The document cannot be nil. If it does not have an _id field when
|
|
// transformed into BSON, one will be added automatically to the marshalled document. The original document will not be
|
|
// modified.
|
|
func (iom *InsertOneModel) SetDocument(doc interface{}) *InsertOneModel {
|
|
iom.Document = doc
|
|
return iom
|
|
}
|
|
|
|
func (*InsertOneModel) writeModel() {}
|
|
|
|
// DeleteOneModel is used to delete at most one document in a BulkWriteOperation.
|
|
type DeleteOneModel struct {
|
|
Filter interface{}
|
|
Collation *options.Collation
|
|
Hint interface{}
|
|
}
|
|
|
|
// NewDeleteOneModel creates a new DeleteOneModel.
|
|
func NewDeleteOneModel() *DeleteOneModel {
|
|
return &DeleteOneModel{}
|
|
}
|
|
|
|
// SetFilter specifies a filter to use to select the document to delete. The filter must be a document containing query
|
|
// operators. It cannot be nil. If the filter matches multiple documents, one will be selected from the matching
|
|
// documents.
|
|
func (dom *DeleteOneModel) SetFilter(filter interface{}) *DeleteOneModel {
|
|
dom.Filter = filter
|
|
return dom
|
|
}
|
|
|
|
// SetCollation specifies a collation to use for string comparisons. The default is nil, meaning no collation will be
|
|
// used.
|
|
func (dom *DeleteOneModel) SetCollation(collation *options.Collation) *DeleteOneModel {
|
|
dom.Collation = collation
|
|
return dom
|
|
}
|
|
|
|
// SetHint specifies the index to use for the operation. This should either be the index name as a string or the index
|
|
// specification as a document. This option is only valid for MongoDB versions >= 4.4. Server versions >= 3.4 will
|
|
// return an error if this option is specified. For server versions < 3.4, the driver will return a client-side error if
|
|
// this option is specified. The driver will return an error if this option is specified during an unacknowledged write
|
|
// operation. The driver will return an error if the hint parameter is a multi-key map. The default value is nil, which
|
|
// means that no hint will be sent.
|
|
func (dom *DeleteOneModel) SetHint(hint interface{}) *DeleteOneModel {
|
|
dom.Hint = hint
|
|
return dom
|
|
}
|
|
|
|
func (*DeleteOneModel) writeModel() {}
|
|
|
|
// DeleteManyModel is used to delete multiple documents in a BulkWrite operation.
|
|
type DeleteManyModel struct {
|
|
Filter interface{}
|
|
Collation *options.Collation
|
|
Hint interface{}
|
|
}
|
|
|
|
// NewDeleteManyModel creates a new DeleteManyModel.
|
|
func NewDeleteManyModel() *DeleteManyModel {
|
|
return &DeleteManyModel{}
|
|
}
|
|
|
|
// SetFilter specifies a filter to use to select documents to delete. The filter must be a document containing query
|
|
// operators. It cannot be nil.
|
|
func (dmm *DeleteManyModel) SetFilter(filter interface{}) *DeleteManyModel {
|
|
dmm.Filter = filter
|
|
return dmm
|
|
}
|
|
|
|
// SetCollation specifies a collation to use for string comparisons. The default is nil, meaning no collation will be
|
|
// used.
|
|
func (dmm *DeleteManyModel) SetCollation(collation *options.Collation) *DeleteManyModel {
|
|
dmm.Collation = collation
|
|
return dmm
|
|
}
|
|
|
|
// SetHint specifies the index to use for the operation. This should either be the index name as a string or the index
|
|
// specification as a document. This option is only valid for MongoDB versions >= 4.4. Server versions >= 3.4 will
|
|
// return an error if this option is specified. For server versions < 3.4, the driver will return a client-side error if
|
|
// this option is specified. The driver will return an error if this option is specified during an unacknowledged write
|
|
// operation. The driver will return an error if the hint parameter is a multi-key map. The default value is nil, which
|
|
// means that no hint will be sent.
|
|
func (dmm *DeleteManyModel) SetHint(hint interface{}) *DeleteManyModel {
|
|
dmm.Hint = hint
|
|
return dmm
|
|
}
|
|
|
|
func (*DeleteManyModel) writeModel() {}
|
|
|
|
// ReplaceOneModel is used to replace at most one document in a BulkWrite operation.
|
|
type ReplaceOneModel struct {
|
|
Collation *options.Collation
|
|
Upsert *bool
|
|
Filter interface{}
|
|
Replacement interface{}
|
|
Hint interface{}
|
|
}
|
|
|
|
// NewReplaceOneModel creates a new ReplaceOneModel.
|
|
func NewReplaceOneModel() *ReplaceOneModel {
|
|
return &ReplaceOneModel{}
|
|
}
|
|
|
|
// SetHint specifies the index to use for the operation. This should either be the index name as a string or the index
|
|
// specification as a document. This option is only valid for MongoDB versions >= 4.2. Server versions >= 3.4 will
|
|
// return an error if this option is specified. For server versions < 3.4, the driver will return a client-side error if
|
|
// this option is specified. The driver will return an error if this option is specified during an unacknowledged write
|
|
// operation. The driver will return an error if the hint parameter is a multi-key map. The default value is nil, which
|
|
// means that no hint will be sent.
|
|
func (rom *ReplaceOneModel) SetHint(hint interface{}) *ReplaceOneModel {
|
|
rom.Hint = hint
|
|
return rom
|
|
}
|
|
|
|
// SetFilter specifies a filter to use to select the document to replace. The filter must be a document containing query
|
|
// operators. It cannot be nil. If the filter matches multiple documents, one will be selected from the matching
|
|
// documents.
|
|
func (rom *ReplaceOneModel) SetFilter(filter interface{}) *ReplaceOneModel {
|
|
rom.Filter = filter
|
|
return rom
|
|
}
|
|
|
|
// SetReplacement specifies a document that will be used to replace the selected document. It cannot be nil and cannot
|
|
// contain any update operators (https://www.mongodb.com/docs/manual/reference/operator/update/).
|
|
func (rom *ReplaceOneModel) SetReplacement(rep interface{}) *ReplaceOneModel {
|
|
rom.Replacement = rep
|
|
return rom
|
|
}
|
|
|
|
// SetCollation specifies a collation to use for string comparisons. The default is nil, meaning no collation will be
|
|
// used.
|
|
func (rom *ReplaceOneModel) SetCollation(collation *options.Collation) *ReplaceOneModel {
|
|
rom.Collation = collation
|
|
return rom
|
|
}
|
|
|
|
// SetUpsert specifies whether or not the replacement document should be inserted if no document matching the filter is
|
|
// found. If an upsert is performed, the _id of the upserted document can be retrieved from the UpsertedIDs field of the
|
|
// BulkWriteResult.
|
|
func (rom *ReplaceOneModel) SetUpsert(upsert bool) *ReplaceOneModel {
|
|
rom.Upsert = &upsert
|
|
return rom
|
|
}
|
|
|
|
func (*ReplaceOneModel) writeModel() {}
|
|
|
|
// UpdateOneModel is used to update at most one document in a BulkWrite operation.
|
|
type UpdateOneModel struct {
|
|
Collation *options.Collation
|
|
Upsert *bool
|
|
Filter interface{}
|
|
Update interface{}
|
|
ArrayFilters *options.ArrayFilters
|
|
Hint interface{}
|
|
}
|
|
|
|
// NewUpdateOneModel creates a new UpdateOneModel.
|
|
func NewUpdateOneModel() *UpdateOneModel {
|
|
return &UpdateOneModel{}
|
|
}
|
|
|
|
// SetHint specifies the index to use for the operation. This should either be the index name as a string or the index
|
|
// specification as a document. This option is only valid for MongoDB versions >= 4.2. Server versions >= 3.4 will
|
|
// return an error if this option is specified. For server versions < 3.4, the driver will return a client-side error if
|
|
// this option is specified. The driver will return an error if this option is specified during an unacknowledged write
|
|
// operation. The driver will return an error if the hint parameter is a multi-key map. The default value is nil, which
|
|
// means that no hint will be sent.
|
|
func (uom *UpdateOneModel) SetHint(hint interface{}) *UpdateOneModel {
|
|
uom.Hint = hint
|
|
return uom
|
|
}
|
|
|
|
// SetFilter specifies a filter to use to select the document to update. The filter must be a document containing query
|
|
// operators. It cannot be nil. If the filter matches multiple documents, one will be selected from the matching
|
|
// documents.
|
|
func (uom *UpdateOneModel) SetFilter(filter interface{}) *UpdateOneModel {
|
|
uom.Filter = filter
|
|
return uom
|
|
}
|
|
|
|
// SetUpdate specifies the modifications to be made to the selected document. The value must be a document containing
|
|
// update operators (https://www.mongodb.com/docs/manual/reference/operator/update/). It cannot be nil or empty.
|
|
func (uom *UpdateOneModel) SetUpdate(update interface{}) *UpdateOneModel {
|
|
uom.Update = update
|
|
return uom
|
|
}
|
|
|
|
// SetArrayFilters specifies a set of filters to determine which elements should be modified when updating an array
|
|
// field.
|
|
func (uom *UpdateOneModel) SetArrayFilters(filters options.ArrayFilters) *UpdateOneModel {
|
|
uom.ArrayFilters = &filters
|
|
return uom
|
|
}
|
|
|
|
// SetCollation specifies a collation to use for string comparisons. The default is nil, meaning no collation will be
|
|
// used.
|
|
func (uom *UpdateOneModel) SetCollation(collation *options.Collation) *UpdateOneModel {
|
|
uom.Collation = collation
|
|
return uom
|
|
}
|
|
|
|
// SetUpsert specifies whether or not a new document should be inserted if no document matching the filter is found. If
|
|
// an upsert is performed, the _id of the upserted document can be retrieved from the UpsertedIDs field of the
|
|
// BulkWriteResult.
|
|
func (uom *UpdateOneModel) SetUpsert(upsert bool) *UpdateOneModel {
|
|
uom.Upsert = &upsert
|
|
return uom
|
|
}
|
|
|
|
func (*UpdateOneModel) writeModel() {}
|
|
|
|
// UpdateManyModel is used to update multiple documents in a BulkWrite operation.
|
|
type UpdateManyModel struct {
|
|
Collation *options.Collation
|
|
Upsert *bool
|
|
Filter interface{}
|
|
Update interface{}
|
|
ArrayFilters *options.ArrayFilters
|
|
Hint interface{}
|
|
}
|
|
|
|
// NewUpdateManyModel creates a new UpdateManyModel.
|
|
func NewUpdateManyModel() *UpdateManyModel {
|
|
return &UpdateManyModel{}
|
|
}
|
|
|
|
// SetHint specifies the index to use for the operation. This should either be the index name as a string or the index
|
|
// specification as a document. This option is only valid for MongoDB versions >= 4.2. Server versions >= 3.4 will
|
|
// return an error if this option is specified. For server versions < 3.4, the driver will return a client-side error if
|
|
// this option is specified. The driver will return an error if this option is specified during an unacknowledged write
|
|
// operation. The driver will return an error if the hint parameter is a multi-key map. The default value is nil, which
|
|
// means that no hint will be sent.
|
|
func (umm *UpdateManyModel) SetHint(hint interface{}) *UpdateManyModel {
|
|
umm.Hint = hint
|
|
return umm
|
|
}
|
|
|
|
// SetFilter specifies a filter to use to select documents to update. The filter must be a document containing query
|
|
// operators. It cannot be nil.
|
|
func (umm *UpdateManyModel) SetFilter(filter interface{}) *UpdateManyModel {
|
|
umm.Filter = filter
|
|
return umm
|
|
}
|
|
|
|
// SetUpdate specifies the modifications to be made to the selected documents. The value must be a document containing
|
|
// update operators (https://www.mongodb.com/docs/manual/reference/operator/update/). It cannot be nil or empty.
|
|
func (umm *UpdateManyModel) SetUpdate(update interface{}) *UpdateManyModel {
|
|
umm.Update = update
|
|
return umm
|
|
}
|
|
|
|
// SetArrayFilters specifies a set of filters to determine which elements should be modified when updating an array
|
|
// field.
|
|
func (umm *UpdateManyModel) SetArrayFilters(filters options.ArrayFilters) *UpdateManyModel {
|
|
umm.ArrayFilters = &filters
|
|
return umm
|
|
}
|
|
|
|
// SetCollation specifies a collation to use for string comparisons. The default is nil, meaning no collation will be
|
|
// used.
|
|
func (umm *UpdateManyModel) SetCollation(collation *options.Collation) *UpdateManyModel {
|
|
umm.Collation = collation
|
|
return umm
|
|
}
|
|
|
|
// SetUpsert specifies whether or not a new document should be inserted if no document matching the filter is found. If
|
|
// an upsert is performed, the _id of the upserted document can be retrieved from the UpsertedIDs field of the
|
|
// BulkWriteResult.
|
|
func (umm *UpdateManyModel) SetUpsert(upsert bool) *UpdateManyModel {
|
|
umm.Upsert = &upsert
|
|
return umm
|
|
}
|
|
|
|
func (*UpdateManyModel) writeModel() {}
|