通过插入新行来更新MongoDB

时间:2015-08-12 09:26:38

标签: mongodb-query

这有效:

 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等)。有人能解释一下原因吗?

2 个答案:

答案 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 usercollection字段的值,将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;