2013-03-18 58 views
3

我有一个文档中的mongodatabase只有在与数据库不同的情况下才更新文档?

user:{ 
    name:'bruce', 
    surname:'wayne', 
    job:'batman', 
    email:'[email protected]', 
} 

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

  1. 查询到数据库中,如果用户存在
  2. 是否存在得到数据库
  3. 的值
  4. 将数据库的值与用户发送的表单值进行比较
  5. 如果来自数据库的值相等,则放弃操作
  6. 如果从数据库中的值是diferent,更新值与窗体值
  7. 靠近db和sent.response

所以在这种情况下,如果用户发送这样的:

form.newUserInfo:{ 
    name:'bruce albert', 
    surname:'wayne', 
    job:'batman only at night', 
    email:'[email protected]', 
} 

只是更新名称和工作。

有没有什么办法可以在6个步骤之内做到这一点?我正在使用nodejs v0.10,mongodb 2.2.3,expressjs和mongoskin v0.5

+1

如果新值与旧值相同,替换它们会带来什么样的危害?请更新您的问题,以包含一些关于_why_您尝试这样做的信息,这可以帮助他人回答您的问题。 – 2013-03-18 00:19:55

+0

我同意马丁,你用这六个步骤获得了什么?如果两个人同时编辑记录,他们仍然会覆盖彼此的变化。 – robertc 2013-03-18 00:22:13

+0

如果新值与旧值相同,则替换它们是没有问题的,因为它们与旧的相同,但它是否有变更只有不同的值另一个问题是当用户第一次插入值时...我要先检查是否存在.. – andrescabana86 2013-03-18 00:36:08

回答

1

听起来好像你正在寻找更新结果的特定字段而不是整个对象本身。即如果用户只有提供名称的更新参数,则只需要更新数据库中的名称。用你的名字:“布鲁斯·艾伯茨”例如,newUserInfo将

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

,你不想简单地使用这些值UPSERT,因为你要么消灭你已经掌握的信息,或添加重复用较少的信息记录。

在这种情况下,您目前只能进行优化。

  1. 查询到数据库中,如果用户如果存在的话得到数据库
  2. 从用户
  3. 发送,如果从数据库中值是平等的形式值进行比较的数据库值的值存在
  4. ,丢弃操作
  5. 如果从数据库中的值是不同的,更新的值与所述表单值
  6. 靠近db和发送响应

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

第4步可以删除,因为从本质上说,它无论如何什么都不做。

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

我的步骤将是

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

希望这有助于。

2

您可能从其他意见/答复中获得了所需的信息。但是,这是插入数据的强大方式。

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

如果您希望能找到差异,但是如果您可以确定文档与用户打开文档时相同,则可以使用findAndModify自动更新与文档相同值的文档当它被加载。

此命令中的更新部分更新所有值,但是如果您愿意,可以根据差异轻松限制它。

该查询与修改前的文档的所有值相匹配。这确保了用户打开它之后它没有被更改。

db.people.findAndModify({ 
    query: { 
     name:'bruce', 
     surname:'wayne', 
     job:'batman', 
     email:'[email protected]', 
    },  
    update: { 
     name:'bruce', 
     surname:'wayne', 
     job:'business owner', 
     email:'[email protected]', 
    }, 
    upsert: true 
    // uncomment next line to get the updated/new document return 
    // ,new : true 
}); 
相关问题