2014-12-18 26 views
9

Nel post this, la risposta accettata spiega che non è possibile avere gli stessi campi sotto $set e $setOnInsert in un'operazione di upsert.

Qualcuno può spiegare perché questo è? Sembra che lo $setOnInsert non sia in conflitto con $set, poiché il primo viene utilizzato quando viene inserito un documento e quest'ultimo viene utilizzato quando il documento viene aggiornato.

+5

Onestamente, non ho una spiegazione del perché questo è il caso ora; Mi piacerebbe vederlo anche implementato. C'è una richiesta di miglioramento, [SERVER-10711] (https://jira.mongodb.org/browse/SERVER-10711), per consentire '$ set' e' $ setOnInsert' a lavorare nello stesso aggiornamento sullo stesso campo . Puoi commentare, guardare e revocare quel problema per aumentarne la priorità. – wdberkeley

+1

grazie per avermelo fatto notare @wdberkeley. sai se c'è una soluzione a questo senza bisogno di due domande? – jtmarmon

risposta

5

$ set operatore viene utilizzato su upsert troppo. Quindi non ha senso riferire gli stessi campi sia su $ set e $ setOnInsert.

Basta provare questo su un insieme vuoto:

db.items.remove(); 
db.items.update({},{$set:{a:1},$setOnInsert:{b:2}},{upsert:1}) 
db.items.find({}); 
+4

Non è "senza senso". Per esempio, ho bisogno che un campo sia 'true' se il documento è stato appena inserito e che sia' false' se è stato appena aggiornato. Se lo stesso campo esiste sia in '$ set' (come' false') che in '$ setOnInsert' (come' true'), e il documento è inserito, il campo in '$ setOnInsert' dovrebbe avere la precedenza anche se esiste anche nella sezione '$ set'. – maganap