位置$
を使用してみてください オペレーター
配列内の要素の位置を明示的に指定せずに更新する配列内の要素を識別する更新では、これは一度に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
が存在するドキュメントにも一致します 配列が空です。