6

在 MongoDB 中,更新修饰符 unset 的工作方式如下:

考虑一个带有集合users的 Mongo DB Database 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”替换?为什么不提供这样的功能?提供这种支持有什么陷阱吗?

4

1 回答 1

26

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

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

db.users.update({"username":"joe"},{"$unset":{"relationships.terminated" : 1}});
于 2011-06-13T08:05:06.447 回答