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

Posted

技术标签:

【中文标题】MongoDB:更新“$ unset”的修饰符语义【英文标题】:MongoDB : Update Modifier semantics of "$unset" 【发布时间】:2011-09-13 17:57:42 【问题描述】:

在 MongoDB 中,更新修饰符 unset 的作用如下:

考虑一个带有 users 集合的 Mongo DB 数据库 db。用户包含一个文档,格式如下:

//Document for a user with username: joe

    "_id" : ObjectId("4df5b9cf9f9a92b1584fff16"),
    "relationships" : 
            "enemies" : 2,
            "friends" : 33,
            "terminated" : "many"
    ,
    "username" : "joe"

如果我想删除终止键,我必须指定 $unset 更新修饰符,如下所示:

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

我的问题是,为什么我必须指定 ENTIRE KEY VALUE PAIR 才能使 $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” " 替换本身?为什么不提供这样的功能?提供这种支持有什么陷阱吗?

【问题讨论】:

【参考方案1】:

简短的回答是因为"relationships.terminated" 不是有效的 json/bson 对象。一个 JSON 对象由一个键和一个值组成,"relationships.terminated" 只有一个键(或值,看你怎么看)。

幸运的是,要在 Mongo 中取消设置字段,您不需要设置要删除的字段的实际值。无论relationships.terminated 的实际值如何,您都可以使用任何值(Mongo 文档中通常使用 1):

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

【讨论】:

为什么不db.users.update("username":"joe","$unset":["relationships.terminated"]);

以上是关于MongoDB:更新“$ unset”的修饰符语义的主要内容,如果未能解决你的问题,请参考以下文章

《MongoDB入门教程》第18篇 文档更新之$unset操作符

mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)

mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)

mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)

如何使用 mongodb 向嵌套文档添加修饰符

什么是 MongoDB 修饰符和运算符?