MongoDB: Обновление семантики модификатора "$ unset" - PullRequest
5 голосов
/ 13 июня 2011

В MongoDB сброс модификатора обновления работает следующим образом:

Рассмотрим базу данных Mongo DB db с коллекцией users . Пользователи содержат Документ следующего формата:

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

У меня такой вопрос, почему мне нужно указать 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

Почему бы и нет?

EDIT

Если путь к $ unset состоит в том, чтобы указать всю пару ключ-значение в соответствии со спецификациями JSON или добавить «1» в качестве значения для оператора, почему Shell не может выполнить «1 "само замещение ? Почему такая функция не предоставляется? Есть ли какие-либо подводные камни для оказания такой поддержки?

1 Ответ

25 голосов
/ 13 июня 2011

Краткий ответ: потому что {"relationships.terminated"} не является допустимым объектом json / bson.JSON-объект состоит из ключа и значения, а {"relationships.terminated"} имеет только ключ (или значение, зависит от того, как вы его выглядите).

К сожалению, для сброса поля в Mongo вам не нужноустановите фактическое значение поля, которое вы хотите удалить.Вы можете использовать любое значение (1 обычно используется в документах Mongo) независимо от фактического значения relationships.terminated:

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