2011-06-13 30 views
5

在MongoDB中更新修改的語義,更新修改未設置工作如下:

考慮一個蒙戈DB數據庫分貝與集合用戶。用戶包含文檔,格式如下:

//Document for a user with username: joe 
{ 
    "_id" : ObjectId("4df5b9cf9f9a92b1584fff16"), 
    "relationships" : { 
      "enemies" : 2, 
      "friends" : 33, 
      "terminated" : "many" 
    }, 
    "username" : "joe" 
} 

如果我想刪除已終止的密鑰,我有如下指定$未設置更新修改:

>db.users.update({"username":"joe"},{"$unset":{"relationships.terminated": "many"}}); 

我的問題是,爲什麼我必須指定整個密鑰值對爲$未設置工作,而不是簡單地規定:

>db.users.update({"username":"joe"},{"$unset":{"relationships.terminated"}}); 

Mon Jun 13 13:25:57 SyntaxError: missing : after property id (shell):1 

爲什麼不呢?

編輯

如果順便$未設置是指定整個鍵值對,按照JSON規範,或加上「1」的值來聲明,爲什麼不能」 t殼牌自己做「1」替代?爲什麼不提供這樣的功能?提供這種支持有沒有缺陷?

回答

25

簡短的回答是因爲{"relationships.terminated"}不是有效的json/bson對象。一個JSON對象由一個鍵和一個值組成,並且{"relationships.terminated"}只有一個鍵(或值,取決於你的看法)。

不幸的是,在Mongo中取消設置字段時,您不需要設置要刪除的字段的實際值。你可以使用任何值(1在蒙戈文檔常用)不管的relationships.terminated實際值:

db.users.update({"username":"joe"},{"$unset":{"relationships.terminated" : 1}}); 
+0

感謝,這是有益的 – DhruvPathak 2011-06-13 08:06:55

+0

爲什麼不'db.users.update({「用戶名」:「喬「},{」$ unset「:[」relationships.terminated「]});'? – 2015-08-12 17:04:40