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

Update document only if it is different from the database?

本文关键字:文档 更新 数据库      更新时间:2023-09-26

我有一个文档在mongodatabase

user:{
    name:'bruce',
    surname:'wayne',
    job:'batman',
    email:'onlyifdanger@batman.com',
}

所以当用户更新信息时,我必须:

    查询用户是否存在
  1. 如果存在,获取数据库
  2. 的值
  3. 将数据库的值与用户
  4. 发送的表单值进行比较
  5. 如果来自数据库的值相等,放弃操作
  6. 如果来自数据库的值不同,则用表单值
  7. 更新值
  8. close db and sent.response

所以在这个例子中如果用户发送了这个:

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

你可能已经从其他评论/答案中得到了你需要的信息。但是,这是一种非常健壮的方式来打乱您拥有的数据。

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

如果你想,你可以找到差异,但如果你可以确定文档是相同的,当用户打开它时,你可以使用findAndModify自动更新文档,其中的值是相同的,当它被加载。

该命令中的update部分更新所有值,但如果您愿意,您可以轻松地根据差异对其进行限制。

查询匹配文档被修改之前的所有值。这可以确保它在用户打开后没有被更改。

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
} );

听起来像是要更新结果的特定字段,而不是整个对象本身。例如,如果用户为名称提供更新参数,则您只希望在数据库中更新该名称。以你的name:'bruce albert'为例,newUserInfo将是

newUserInfo: {
  name: 'bruce albert',
  surname: '',
  job: '',
  email: ''
}

并且您不想简单地打乱这些值,因为您要么擦除已有的信息,要么添加信息较少的重复记录。

在这种情况下,您只能优化到此为止。

  1. 查询数据库是否存在
  2. 如果存在,获取数据库
  3. 的值
  4. 将数据库的值与用户
  5. 发送的表单值进行比较
  6. 如果来自数据库的值相等,放弃操作
  7. 如果数据库中的值不一致,用
  8. 形式的值更新值
  9. 关闭数据库并发送响应

步骤1和步骤2可以合并,因为findOne()(或类似的东西)将返回一个匹配参数的记录,但前提是对象存在。如果不存在,您可能需要插入用户传递的值。

第4步可以删除,因为实际上它什么也没做。

步骤5可能是最重要的,因为你必须定义值如何"不同"。想想看,你想用job= "来更新吗?因为这与"batman"不同",尽管你可能不想更新这个值。

我的步骤是

  1. 查看该记录是否存在于数据库中。
    • 如果没有,插入对象并转到步骤3
    • 如果是,转到步骤2
  2. 比较数据库对象中的值与用户提供的值。
    • 如果值不同(以你想要的方式),根据需要更新每个字段。
    • 如果值相同,则无需处理,转到步骤3
  3. 关闭数据库并发送响应给用户