如何使用不区分大小写的输入更新mongoDB/Mongoose中的记录

如何使用不区分大小写的输入更新mongoDB/Mongoose中的记录,mongodb,mongoose,Mongodb,Mongoose,我是MongoDB/Mongoose的新手,我在更新姓名电话号码的PUT请求中遇到了问题 目标:我的前端可以接收个人姓名和电话号码。每当它接收到一个已经存在于我们记录中的名称时,它都会询问用户是否要替换该号码。此外,姓名输入应该不区分大小写,这意味着只要拼写正确,就应该更新电话号码 e、 g.如果我们的记录中存在{name:Test,number:123},输入{name:Test,number:456}将提供一个弹出菜单,确认用户是否要更改其姓名。如果选择Ok,记录将更改为{name:Test

我是MongoDB/Mongoose的新手,我在更新姓名电话号码的PUT请求中遇到了问题

目标:我的前端可以接收个人姓名和电话号码。每当它接收到一个已经存在于我们记录中的名称时,它都会询问用户是否要替换该号码。此外,姓名输入应该不区分大小写,这意味着只要拼写正确,就应该更新电话号码

e、 g.如果我们的记录中存在
{name:Test,number:123}
,输入
{name:Test,number:456}
将提供一个弹出菜单,确认用户是否要更改其姓名。如果选择Ok,记录将更改为
{name:Test,number:456}
,同时在前端和后端数据库上反映其更改

目前,我的模式定义如下(在另一个文件上)

更新功能的当前代码如下所示,在大多数情况下都有效:

app.put('/api/persons/:id', (req, res, next) => {
    const body = req.body
    const person = {
        name: body.name,
        number: body.number,
    }

    Person.findByIdAndUpdate(req.params.id, person, { new: true })
        .then(updatedPerson => res.json(updatedPerson))
        .catch(err => next(err))

    // catch is for error handling
})
主要问题:但是,当我输入一个同名但大小写不同的名称时,上述代码不起作用。例如,名称“Test”和“Test”被认为是不同的。根据我在控制台上打印的内容,错误的主要来源是ID不同,因此我的代码找不到相同的条目

i、 e.用于存储名为“Test”的记录的ID与新条目的ID不同
{name:Test,number:123}
,因此我的输入条目ID不存在于我的数据库中

以上是有点奇怪的感觉,每当我输入相同大小写的名称时,它确实起作用

根据一些搜索,我发现了一个不同的stackoverflow建议,它使用regex和
findoneandupdate
,因此我尝试了以下方法:

app.put('/api/persons/:id', (req, res, next) => {

    const body = req.body
    const person = {
        name: body.name,
        number: body.number,
    }

    // for testing purpose,
    // this prints out the correct name
    Person.find({ name: new RegExp(`^${body.name}$`, `i`) })
        .then(result => {
            console.log(result[0])
        })

    Person.findOneAndUpdate({ name: new RegExp(`^${body.name}$`, `i`) }, person, { new: true })
        .then(updatePerson => {
            res.json(updatePerson)
        })
        .catch(err => next(err))
})
这方面没有什么问题:

  • 人员姓名的大小写发生变化(因此,如果新输入的名称为“TEST”,则在应保留初始输入的大小写时,它会将其全部大写)
  • 上面的工作是通过VS代码上的REST客户端扩展完成的,这类似于Postman。然而,实际上在前端上的测试也存在着找不到ID的问题
  • 我想知道在获取不区分大小写的条目并保留名称的同时,使用
    findbyidanddupdate
    (最好)或
    findOneAndUpdate
    更新条目的正确方法是什么

    以下是我的前端的外观,仅供参考:

    您可以添加字段查询名称:字符串,该字符串是名称的小写版本。 我会用猫鼬钩

    const personSchema = new mongoose.Schema({
        name: String,
        number: String,
        original_name : String
    })
    
    personSchema.pre('save', function(next) {
      this.query_name = this.name.toLowerCase();
      next();
    });
    
    你可以阅读更多关于它的信息,也许可以在这里找到另一个解决方案

    注:
    *不要使用箭头函数,因为它没有“this”属性。

    也许您可以将输入全部转换为小写?谢谢您的回复!我回去和后端做了一些混乱,但仍然有问题。然而,事实证明,问题出在前端,在前端检查区分大小写是可行的,但前端的实际更新过程并没有检查它。这确实让我感到意外,但之后很容易修复。再次感谢您的回复!
    const personSchema = new mongoose.Schema({
        name: String,
        number: String,
        original_name : String
    })
    
    personSchema.pre('save', function(next) {
      this.query_name = this.name.toLowerCase();
      next();
    });