我在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
答案 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可以合并,因为findOne()(或者那种效果)将返回记录匹配参数,但仅在对象存在时返回。如果它不存在,您可能希望插入用户传递的值。
第4步可以删除,因为从本质上说它无论如何都无能为力。
步骤5可能是最重要的,因为您必须定义值如何“不同”。想想,你想用job =''更新吗?因为这与“蝙蝠侠”有所不同,尽管您可能不希望使用该值进行更新。
我的步骤是
希望这有帮助。