【问题标题】:MongoDB: How to avoid name doubles in collectionMongoDB:如何避免集合中的名称双倍
【发布时间】:2020-12-02 22:59:36
【问题描述】:

由于我在搜索中找不到任何内容,所以我会在这里问一个问题试试运气:

我正在尝试在“客户”集合中创建唯一文档,为了确保它们是唯一的,我搜索了集合中的(唯一!)名称字段以检查是否已经创建了客户。现在我试图排除区分大小写的双打以及空白双打。 (示例客户:“SpaceX”已经存在,所以我不应该创建“Spacex”或“SpaceX”或“Space X”,只是为了确保客户的文档是唯一的)。

所以我要做的是使用$regex 遍历索引名称字段,如果找到,则返回错误。

我发现customer.find({name: {$regex: new RegEx(name), $options: 'ix' }) 在这种情况下不起作用,但根据文档,应该过滤掉该名称的空格修剪和不区分大小写的文档.... 这让我疯狂。有谁知道如何解决这个问题?

这是我当前放置检查的代码:

  let existingCustomer
  try {
    console.log(new RegExp(name), typeof name)
    existingCustomer = await Customer.find(
      {
        name: { $regex: new RegExp(name), $options: 'ix' },
      },
      '-products -tam -responsiblePerson -info -created -updated'
    )
    console.log(existingCustomer)
  } catch (err) {}

  if (existingCustomer.length > 0) {
    console.log(existingCustomer[0])
    const error = new HttpError(
      'Customer name already exists, please use a different name.',
      500
    )
    return next(error)
  }

【问题讨论】:

    标签: javascript regex mongodb mongoose mongodb-query


    【解决方案1】:

    你可以这样做:

    Customer.find({
            name: { $regex: new RegExp("^" +name.replace(/\s/g, ''), "i") }
          })
    

    但由于mongoose 3.4,建议使用case sensitive index:文档here

    所以你可以简单地做:

    Customer.find({
             name: name.replace(/\s/g, '')
            })
           .collation( { locale: 'en', strength: 2 } )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      相关资源
      最近更新 更多