Versuchen Sie, den positionsbezogenen $
zu verwenden Betreiber
in der Aktualisierung, die ein zu aktualisierendes Element in einem Array identifiziert, ohne die Position des Elements im Array explizit anzugeben, aber dies wird immer nur mit einem Element gleichzeitig übereinstimmen:
User.update(
{
"local.email": user,
"devices.id": { "$ne": deviceID },
"devices.name": { "$ne": deviceName }
},
{
"$set": {
"devices.$.id": deviceID,
"devices.$.name": deviceName
}
}
);
Aus den Dokumenten , fungiert der positionelle $-Operator als Platzhalter für das erste Element, das mit dem Abfragedokument übereinstimmt, und das Array-Feld muss als Teil des Abfragedokuments erscheinen, daher das Abfragedokument
"devices.id": { "$ne": deviceID },
"devices.name": { "$ne": deviceName }
enthält das device
Array und wird mit jenen Dokumenten übereinstimmen, in denen das device
Array id
ist nicht gleich deviceID
und der Name ist nicht derselbe wie der Name, den Sie aktualisieren möchten. Dies wird sogar mit Dokumenten übereinstimmen, in denen device
Array ist leer.