MongoDB:“ $ unset”的更新修饰符语义

|| 在MongoDB中,未设置update修饰符的工作方式如下: 考虑具有收集用户的Mongo DB数据库db。用户包含以下格式的文档:
//Document for a user with username: joe
{
    \"_id\" : ObjectId(\"4df5b9cf9f9a92b1584fff16\"),
    \"relationships\" : {
            \"enemies\" : 2,
            \"friends\" : 33,
            \"terminated\" : \"many\"
    },
    \"username\" : \"joe\"
}
如果要删除终止键,则必须指定$ unset update修饰符,如下所示:
>db.users.update({\"username\":\"joe\"},{\"$unset\":{\"relationships.terminated\": \"many\"}});
我的问题是,为什么我必须指定整个键值对才能使$ unset起作用,而不是简单地指定:
>db.users.update({\"username\":\"joe\"},{\"$unset\":{\"relationships.terminated\"}});

Mon Jun 13 13:25:57 SyntaxError: missing : after property id (shell):1
为什么不? 编辑: 如果$ unset的方法是按照JSON规范指定整个键值对,或在语句中添加\“ 1 \”作为值,那么Shell为何不能执行\“ 1 \”替代本身?为什么没有提供这样的功能?提供这种支持有什么陷阱吗?     
已邀请:
        简短的答案是因为
{\"relationships.terminated\"}
不是有效的json / bson对象。 JSON对象由一个键和一个值组成,“ 3”仅包含一个键(或值,取决于您的外观)。 幸运的是,在Mongo中取消设置字段时,您无需设置要删除的字段的实际值。您可以使用任何值(Mon5ѭ的实际值)(在Mongo文档中通常使用1):
db.users.update({\"username\":\"joe\"},{\"$unset\":{\"relationships.terminated\" : 1}});
    

要回复问题请先登录注册