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}});
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...