1. ホーム
  2. mongodb

[解決済み] MongoDB のオブジェクトを部分的に更新して、新しいオブジェクトを既存のオブジェクトにオーバーレイ/マージするにはどうすればよいですか?

2022-04-03 16:23:32

質問

MongoDBに保存されたこのドキュメントがあるとします。

{
   _id : ...,
   some_key: { 
        param1 : "val1",
        param2 : "val2",
        param3 : "val3"
   }
}

に関する新しい情報を持つオブジェクト。 param2param3 を保存する必要があります。

var new_info = {
    param2 : "val2_new",
    param3 : "val3_new"
};

新しいフィールドをオブジェクトの既存の状態の上にマージ/オーバーレイして、param1が削除されないようにしたい。

これを行うには

db.collection.update(  { _id:...} , { $set: { some_key : new_info  } } 

MongoDB は聞かれたとおりに、some_key をその値に設定します。 古いものを置き換えます。

{
   _id : ...,
   some_key: { 
      param2 : "val2_new",
      param3 : "val3_new"
   }
}

MongoDBに新しいフィールドだけを(一つ一つ明示的に記述せずに)更新させる方法は? というと、こうなります。

{
   _id : ...,
   some_key: { 
        param1 : "val1",
        param2 : "val2_new",
        param3 : "val3_new"
   }
}

私はJavaクライアントを使用していますが、任意の例があればありがたい

どのように解決するのですか?

私が質問を正しく理解するならば、あなたは他のドキュメントの内容でドキュメントを更新したいのですが、まだ存在しないフィールドだけを更新し、すでに設定されているフィールドは完全に無視します(たとえ別の値であっても)。

1つのコマンドでそれを行う方法はありません。

まず、ドキュメントにクエリを発行し、何をしたいのか? $set そして、それを更新します (古い値をマッチングフィルターとして使用し、その間に同時更新が発生しないようにします)。


ご質問の別の読み方としては、あなたが満足しているのは $set しかし、すべてのフィールドを明示的に設定したいわけではありません。その場合、どのようにデータを渡すのでしょうか?

次のようにすればよいことはご存じでしょう。

db.collection.update(  { _id:...} , { $set: someObjectWithNewData }