Javascript 仅当文档与数据库不同时更新文档?

Javascript 仅当文档与数据库不同时更新文档?,javascript,node.js,mongodb,express,mongoskin,Javascript,Node.js,Mongodb,Express,Mongoskin,我在mongodatabase中有一个文档 user:{ name:'bruce', surname:'wayne', job:'batman', email:'onlyifdanger@batman.com', } 因此,当用户更新信息时,我必须: 如果用户存在,则查询数据库 如果存在,则获取数据库的值 将数据库的值与用户发送的表单值进行比较 如果数据库中的值相等,则放弃操作 如果数据库中的值不同,请使用表单值更新这些值 关闭数据库并发送响应 因此,在这种情况

我在mongodatabase中有一个文档

user:{
    name:'bruce',
    surname:'wayne',
    job:'batman',
    email:'onlyifdanger@batman.com',
}
因此,当用户更新信息时,我必须:

  • 如果用户存在,则查询数据库
  • 如果存在,则获取数据库的值
  • 将数据库的值与用户发送的表单值进行比较
  • 如果数据库中的值相等,则放弃操作
  • 如果数据库中的值不同,请使用表单值更新这些值
  • 关闭数据库并发送响应
  • 因此,在这种情况下,如果用户发送:

    form.newUserInfo:{
        name:'bruce albert',
        surname:'wayne',
        job:'batman only at night',
        email:'onlyifdanger@batman.com',
    }
    
    只需更新名称和作业


    有没有办法在不到6步的时间内完成这项工作?我使用的是nodejs v0.10、mongodb 2.2.3、expressjs和mongoskin v0.5,听起来像是要更新结果的特定字段,而不是整个对象本身。也就是说,如果用户只提供名称的更新参数,那么您只想更新数据库中的名称。使用您的名字:'bruce albert'示例,newUserInfo将是

    newUserInfo: {
      name: 'bruce albert',
      surname: '',
      job: '',
      email: ''
    }
    
    您不想简单地使用这些值进行upsert,因为您要么删除已有的信息,要么添加信息较少的重复记录

    在这种情况下,您只能优化到目前为止

  • 如果用户存在,则查询数据库
  • 如果存在,则获取数据库的值
  • 将数据库的值与用户发送的表单值进行比较
  • 如果数据库中的值等于,则放弃该操作
  • 如果数据库中的值不同,请使用表单值更新这些值
  • 关闭数据库并发送响应
  • 第1步和第2步可以结合使用,因为findOne()(或类似的内容)将返回与参数匹配的记录,但仅当对象存在时。如果它不存在,您可能希望插入用户传递的值

    步骤4可以删除,因为本质上它什么都不做

    步骤5可能是最重要的,因为您必须定义值如何“不同”。想一想,你想用job=''更新吗?因为这与“蝙蝠侠”不同,尽管您可能不想使用该值进行更新

    我的步伐会很快

  • 查看数据库中是否存在该记录。
    • 如果没有,请插入对象并转至步骤3
    • 如果是,请转至步骤2
  • 将数据库对象中的值与用户提供的值进行比较。
    • 如果值不同(以您想要的方式),请根据需要更新每个字段
    • 如果值相同,则无需执行任何操作,请转至步骤3
  • 关闭数据库并向用户发送响应

  • 希望这有帮助。

    您可能已经从其他评论/答案中获得了所需的信息。但是,这是一种非常健壮的方法,可以向上插入您拥有的数据

    使用$findAndModify可以控制乐观并发和upsert

    如果需要,您可以找到差异,但如果您可以确保文档与用户打开文档时相同,则可以使用findAndModify自动更新文档,其中的值与加载文档时的值相同

    此命令中的“更新”部分将更新所有值,但如果需要,可以根据差异轻松地对其进行限制

    查询匹配文档修改前的所有值。这样可以确保自用户打开它后,它不会被更改

    db.people.findAndModify( {
       query: {
            name:'bruce',
            surname:'wayne',
            job:'batman',
            email:'onlyifdanger@batman.com',
        },    
       update: {
            name:'bruce',
            surname:'wayne',
            job:'business owner',
            email:'bruce@wayne.com',
        },
       upsert: true
       // uncomment next line to get the updated / new document return
       // ,new : true
    } );
    

    如果新的价值观与旧的价值观相同,替换它们会有什么危害?请更新您的问题,包括您为什么尝试这样做的一些信息,这可以帮助其他人回答您的问题。我同意Martin的观点,这六个步骤有什么好处?如果两个人同时编辑记录,他们仍将覆盖对方的更改。如果新值与旧值相同,则替换它们没有问题,因为旧值相同,但是否可以只更改不同的值??另一个问题是当用户第一次插入值时。。。我必须首先检查是否存在..upsert=true更新将插入记录,如果它不存在。因此,您永远不需要检查记录是否已经存在——这无论如何都不是线程安全的。你应该用他们提供的价值观来更新,不管这些价值观是新的还是不新的,这都无关紧要——你正在用你的6个步骤做更多的工作,而整个事情都可以用一个步骤来完成。如果一个价值观不存在,比如不需要的工作,会发生什么。。。更新将是作业=“”??