仅当文档与数据库不同时更新文档
Update document only if it is different from the database?
我有一个文档在mongodatabase
user:{
name:'bruce',
surname:'wayne',
job:'batman',
email:'onlyifdanger@batman.com',
}
所以当用户更新信息时,我必须:
- 查询用户是否存在
- 如果存在,获取数据库 的值
- 将数据库的值与用户 发送的表单值进行比较
- 如果来自数据库的值相等,放弃操作
- 如果来自数据库的值不同,则用表单值 更新值
- 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可以合并,因为findOne()(或类似的东西)将返回一个匹配参数的记录,但前提是对象存在。如果不存在,您可能需要插入用户传递的值。
第4步可以删除,因为实际上它什么也没做。
步骤5可能是最重要的,因为你必须定义值如何"不同"。想想看,你想用job= "来更新吗?因为这与"batman"不同",尽管你可能不想更新这个值。
我的步骤是
- 查看该记录是否存在于数据库中。
- 如果没有,插入对象并转到步骤3
- 如果是,转到步骤2
- 比较数据库对象中的值与用户提供的值。
- 如果值不同(以你想要的方式),根据需要更新每个字段。
- 如果值相同,则无需处理,转到步骤3
- 关闭数据库并发送响应给用户
- 流星收集更新不是在更新文档
- 使用猫鼬更新子文档
- MongoDB findAndModify:>>>查找和更新文档数组中的对象
- Javascript 不会在浏览器中更新文档
- 更新数组中的嵌入文档 - Mongodb + Node Driver
- 如何在猫鼬中更新文档后添加一些操作
- Mongodb 嵌套文档更新
- 检查文档是否已经存在,如果是则更新,否则创建新的Mongoose
- 如何在更新mongo文档时使用变量
- 在更新选择器中使用$in时颠倒多个文档
- 编辑以前保存的文档也会更新数据库中的文档
- 使用mongodb更新多个文档
- Mongoose创建一个文档,如果找不到指定的字段,则更新文档中的数组
- Meteor Update集合-未捕获错误:不允许.不受信任的代码只能通过ID更新文档.[403]
- Mongo-shell游标:更新后的文档再次到达游标
- 在MongoDB中获取“更新前”文档
- 数组中嵌入文档的集合更新属性
- 如何将一些参数从javascript接收响应字符串 asp.net 页面并更新html文档
- 如何从 MongoDB 文档更新与特定值匹配的数组
- 猫鼬嵌入文档更新