6

MongoDBでは、更新修飾子unsetは次のように機能します。

コレクションusersを持つMongoDBデータベースデータベースについて考えてみます。ユーザーには、次の形式のドキュメントが含まれています。

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

私の質問は、$ 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」を追加することである場合、シェルが「1」の置換自体を実行できないのはなぜですか?なぜそのような機能が提供されないのですか?そのようなサポートを提供することの落とし穴はありますか?

4

1 に答える 1

26

簡単な答えは、{"relationships.terminated"}が有効なjson/bsonオブジェクトではないためです。JSONオブジェクトはキーと値で構成され{"relationships.terminated"}、キー(または値は見た目によって異なります)のみを持ちます。

幸い、Mongoでフィールドの設定を解除するために、削除するフィールドの実際の値を設定する必要はありません。relationships.terminated:の実際の値に関係なく、任意の値(1はMongoドキュメントで一般的に使用されます)を使用できます。

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