这有效:
db.users.update( { _id:ObjectId("1234")}, { $set: { active: 1 } } )
,因为:
如果该字段不存在,$ set将添加具有指定值的新字段,前提是新字段不违反类型约束。
因此创造了活跃的价值" 1"我很开心,因为这就是我想要的。
但是
db.users.update( { _id:ObjectId("1234")}, { $set: { profile: { active: 1 } } } )
这不是写"活跃:1"作为配置文件中的新行,将删除" profile"的所有数据。然后,当' profile'是空的,最后插入"活动:1"。我刚丢失了25k用户的数据(profile.name,profile.age等)。有人能解释一下原因吗?
答案 0 :(得分:1)
$ set 运算符替换具有指定值的字段的值。
要更新嵌入字段,请使用点表示法。使用点表示法时,将整个虚线字段名称括在引号中:
db.users.update( { _id:ObjectId("1234")}, { $set: { "profile.activeactive": 1 } } )
答案 1 :(得分:0)
您的代码存在的问题是,当您执行
时db.users.update( { _id:ObjectId("1234")}, { $set: { profile: { active: 1 } } } )
它会更新profile
user
中collection
字段的值,将profile
字段的内容替换为{ active: 1 }
作为您获得的行为
要更新特定field('active' in this case)
中的特定document({ profile: { active: 1 } in this case)
,您必须使用dot
表示法。例如:
db.users.update( { _id:ObjectId("1234")}, { $set: { "profile.active": 1 } } )
它也会进行更新,但现在它将update
active
集合中profile
文档的user
字段。
<强>释强>
$set
运算符用指定的值替换字段的值 值。如果该字段不存在,$ set将添加一个新字段 指定的值,前提是新字段不违反类型 约束。如果为不存在的字段指定虚线路径, $ set将根据需要创建嵌入文档以实现 通往该领域的虚线路径。
如果指定多个字段 - 值对,则$ set将更新或创建 每个领域。
对于参考:&#34; http://docs.mongodb.org/manual/reference/operator/update/set/&#34;