MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

I nomi dei campi del documento non possono iniziare con '$' (chiave non valida:'$set')

Non dovresti avere il { "orgId" : 2 } nel documento di aggiornamento.

Rimuovi questa riga dal codice e dovrebbe funzionare correttamente.

u.append("orgId", orgId);

Il motivo per cui hai attivato l'errore è che ci sono due modi per specificare l'aggiornamento per un documento e hai creato un pane incrociato di entrambi. Le opzioni sono:

  1. Fornire il documento completo per l'aggiornamento. Per questo modello il documento esistente viene sovrascritto dal documento fornito.
  2. Utilizza gli operatori di aggiornamento per modificare il documento esistente nella raccolta.

Se utilizzi la seconda versione, tutte le "chiavi di livello superiore" nel documento di aggiornamento inizieranno con un $ . Se utilizzi la prima opzione, nessuna delle chiavi di livello superiore inizierà con un $ . Il codice ha esaminato il primo campo, ha pensato che fosse un documento sostitutivo e poi ha fallito quando ha tentato di convalidare il resto del documento era valido poiché le chiavi nei documenti non possono iniziare con un $ (per non essere confuso con documenti di aggiornamento o query).

Modifica:

Nel caso di un upsert (ad esempio, il documento non esiste già e si contrassegna l'aggiornamento per consentire l'upsert) gli operatori di corrispondenza esatta della query vengono utilizzati per eseguire il seeding del documento. Per l'esempio sopra otteniamo un documento seme di { "orgId" : 2 } . Il server applicherà quindi gli operatori di aggiornamento e salverà il risultato.