mongodb/mongoose:如果来自nestjs的数据不为空,则保存唯一值

Posted

技术标签:

【中文标题】mongodb/mongoose:如果来自nestjs的数据不为空,则保存唯一值【英文标题】:mongodb/mongoose: Save unique value if data is not null in from nestjs 【发布时间】:2022-01-07 04:40:13 【问题描述】:

我正在尝试将数据保存在 MongoDB 中。当数据不为空时,我想存储唯一数据。但是,我想在唯一标识符中允许多个空值。

我的示例架构:

@Schema()
export class Contact extends Document 
  @Prop( unique: true, sparse: true, require: true )
  email: string;
  
  @Prop( default: '+1' )
  countryCode: string;

  @Prop( unique: true, sparse: true )
  mobile: string;

在这种情况下,不需要手机号码。用户可以在提供或不提供手机号码的情况下添加他们的联系信息。如果用户发送的手机号码应该是唯一的。所以,我需要在mobile 字段中允许多个null 值。但是,当用户提供任何手机号码时,该字段应该是唯一的。

空条目似乎获得值null,因此每个没有mobile 的条目都会因unique 标识符而崩溃。

有没有办法从数据库层或者应用层解决这个问题?

我正在使用 NestJS 开发我的 API。

【问题讨论】:

检查nestjs验证:docs.nestjs.com/techniques/validation 【参考方案1】:

唯一索引仍然不允许具有 null 字段的多个文档。在将文档保存到 MongoDB 之前,您需要通过删除 null 字段来转换数据负载。转换管道将帮助您处理此问题。这是一个可用于此目的的转换管道:

@Injectable()
export class NullValidationPipe implements PipeTransform 
  private isObj(obj: any): boolean 
    return typeof obj === 'object' && obj !== null;
  

  private dropNull(values) 
    Object.keys(values).forEach((key) => 
      if (!(key === 'password' || key === '_id')) 
        if (this.isObj(values[key])) 
          values[key] = this.dropNull(values[key]);
         else if (Array.isArray(values[key]) && values[key].length > 0) 
          values[key] = values[key].map((value) => 
            if (this.isObj(value)) 
              value = this.dropNull(value);
            
            return value;
          );
         else 
          if (values[key] === null || values[key] === undefined) 
            delete values[key];
          
        
      
    );
    return values;
  

  transform(values: any, metadata: ArgumentMetadata) 
    const  type  = metadata;
    if (type === 'param' || type === 'custom') return values;
    else if (this.isObj(values) && type === 'body') 
      return this.dropNull(values);
    

    throw new BadRequestException('Validation failed');
  

在控制器中使用此管道,此管道将丢弃所有传入的空字段,这些字段将随请求负载一起提供。

您还可以查看嵌套管道转换文档:https://docs.nestjs.com/techniques/validation

【讨论】:

以上是关于mongodb/mongoose:如果来自nestjs的数据不为空,则保存唯一值的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB、Mongoose、外键、连接表

MongoDB / Mongoose 有很多关系

如何将 websocket 放入数据库(mongoDB/mongoose)?

mongodb / mongoose 中的部分索引

更改 mongoDB/mongoose 中的模式

MongoDB/mongoose 查询和 $in 运算符