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

时间:2011-06-13 07:54:58

标签: json language-agnostic mongodb semantics unset

在MongoDB中,更新修饰符未设置如下:

考虑使用集合用户的Mongo数据库数据库 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” “替换本身?为什么不提供这样的功能?是否有提供此类支持的陷阱?

1 个答案:

答案 0 :(得分:25)

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

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

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