|  | @@ -14,12 +14,14 @@ var (
 | 
	
		
			
				|  |  |  	ErrInternalError    = errors.New("internal error") // ErrInternalError 上游函数错误时返回
 | 
	
		
			
				|  |  |  	ErrDataError        = errors.New("data error")     // ErrDataError 数据校验失败
 | 
	
		
			
				|  |  |  	ErrPermissionDenied = errors.New("permission denied")
 | 
	
		
			
				|  |  | +	ErrNoDocuments      = mo.ErrNoDocuments
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func IsItemNotFound(err error) bool     { return errors.Is(err, ErrItemNotfound) }
 | 
	
		
			
				|  |  |  func IsInternalError(err error) bool    { return errors.Is(err, ErrInternalError) }
 | 
	
		
			
				|  |  |  func IsDataError(err error) bool        { return errors.Is(err, ErrDataError) }
 | 
	
		
			
				|  |  |  func IsPermissionDenied(err error) bool { return errors.Is(err, ErrPermissionDenied) }
 | 
	
		
			
				|  |  | +func IsErrNoDocuments(err error) bool   { return errors.Is(err, ErrNoDocuments) }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type Service struct {
 | 
	
		
			
				|  |  |  	Items  ii.Items
 | 
	
	
		
			
				|  | @@ -311,7 +313,12 @@ func (s *Service) UpdateOne(name ii.Name, filter, updater mo.Filter) error {
 | 
	
		
			
				|  |  |  		s.Log.Error("svc.UpdateOne: PrepareUpdater: %s data error: %s updater: %v", name, err, update)
 | 
	
		
			
				|  |  |  		return errors.Join(ErrDataError, err)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	_, err := info.Open(s.Client).UpdateOne(filter, update)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	opts := mo.Options.Update()
 | 
	
		
			
				|  |  | +	upsert := mo.OperatorHas(update, mo.PoSetOnInsert)
 | 
	
		
			
				|  |  | +	opts.Upsert = &upsert
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	_, err := info.Open(s.Client).UpdateOne(filter, update, opts)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		s.Log.Error("svc.UpdateOne: %s internal error: %s filter: %v updater: %v", name, err, filter, update)
 | 
	
		
			
				|  |  |  		return errors.Join(ErrInternalError, err)
 | 
	
	
		
			
				|  | @@ -350,7 +357,12 @@ func (s *Service) UpdateMany(name ii.Name, filter, updater mo.Filter) error {
 | 
	
		
			
				|  |  |  		s.Log.Error("svc.UpdateMany: PrepareUpdater: %s data error: %s updater: %v", name, err, update)
 | 
	
		
			
				|  |  |  		return errors.Join(ErrDataError, err)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	result, err := info.Open(s.Client).UpdateMany(query, update)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	opts := mo.Options.Update()
 | 
	
		
			
				|  |  | +	upsert := mo.OperatorHas(update, mo.PoSetOnInsert)
 | 
	
		
			
				|  |  | +	opts.Upsert = &upsert
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	result, err := info.Open(s.Client).UpdateMany(query, update, opts)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		s.Log.Error("svc.UpdateMany: %s internal error: %s filter: %v updater: %v", name, err, query, update)
 | 
	
		
			
				|  |  |  		return errors.Join(ErrInternalError, err)
 |