Spróbuj użyć pozycyjnego $
operator
w aktualizacji, która identyfikuje element w tablicy do aktualizacji bez wyraźnego określenia pozycji elementu w tablicy, ale zawsze będzie to pasować tylko do jednego elementu na raz:
User.update(
{
"local.email": user,
"devices.id": { "$ne": deviceID },
"devices.name": { "$ne": deviceName }
},
{
"$set": {
"devices.$.id": deviceID,
"devices.$.name": deviceName
}
}
);
Z dokumentacji , pozycyjny operator $ działa jako symbol zastępczy dla pierwszego elementu, który pasuje do dokumentu zapytania, a pole tablicy musi pojawić się jako część dokumentu zapytania, stąd dokument zapytania
"devices.id": { "$ne": deviceID },
"devices.name": { "$ne": deviceName }
zawiera device
tablica i będzie pasować do tych dokumentów, w których device
tablica id
nie jest równa deviceID
a nazwa nie jest taka sama jak nazwa, którą próbujesz zaktualizować. Dopasuje to nawet dokumenty, w których device
tablica jest pusta.