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

时间:2013-03-18 00:10:31

标签: javascript node.js mongodb express mongoskin

我在mongodatabase中有一个文档

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

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

    如果用户存在,
  1. 查询数据库
  2. 如果存在,则获取数据库的值
  3. 将数据库的值与用户
  4. 发送的表单值进行比较
  5. 如果数据库中的值等于,则丢弃操作
  6. 如果数据库中的值不同,请使用表单值
  7. 更新值
  8. 关闭db和sent.response
  9. 所以在这种情况下,如果用户发送了这个:

    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

2 个答案:

答案 0 :(得分:2)

您可能从其他评论/答案中获得了所需的信息。但这是一种非常强大的方式来存储您拥有的数据。

使用$ 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
} );

答案 1 :(得分:1)

听起来您希望更新结果的特定字段而不是整个对象本身。即如果用户提供名称的更新参数,则只需更新数据库中的名称。使用你的名字:'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 =''更新吗?因为这与“蝙蝠侠”有所不同,尽管您可能不希望使用该值进行更新。

    我的步骤是

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