位置$を使用してみてください オペレーター
配列内の要素の位置を明示的に指定せずに更新する配列内の要素を識別する更新では、これは一度に1つの要素にのみ一致します:
User.update(
{
"local.email": user,
"devices.id": { "$ne": deviceID },
"devices.name": { "$ne": deviceName }
},
{
"$set": {
"devices.$.id": deviceID,
"devices.$.name": deviceName
}
}
);
docs から 、positional $演算子は、クエリドキュメントに一致する最初の要素のプレースホルダーとして機能し、配列フィールドはクエリドキュメントの一部として表示される必要があるため、クエリドキュメント
"devices.id": { "$ne": deviceID },
"devices.name": { "$ne": deviceName }
deviceが含まれています 配列であり、deviceが存在するドキュメントと一致します 配列id deviceIDと等しくありません 名前は、更新しようとしている名前と同じではありません。これは、deviceが存在するドキュメントにも一致します 配列が空です。