2013-04-25 8 views
5

Capisco il fatto che non è possibile aggiornare _id su un documento mongodb esistente.Aggiornamento Mongodb. setOnInsert Mod on _id non consentito

Ma c'è un motivo per cui non possiamo usarlo in un upsert nella parte 'setOnInsert'? Perché è "su inserto" quindi non è un aggiornamento.

mio utilizzo previsto è questo:

db.myCol.update({_id:12345},{$setOnInsert:{_id:12345},$set:{myValue:'hi'}}); 

È questo un bug o mi sto perdendo qualcosa?

+1

dov'è la bandiera di upsert? lascia setOnInsert e la cosa giusta accadrà. db.myCol.update ({_ id: 12345}, {$ set: {myValue: 'hi'}}) –

+1

Sì hai ragione ho dimenticato di includere la bandiera di upsert. Apparentemente include automaticamente la parte di ricerca per l'inserto se è un upsert. Grazie :) –

+0

esattamente. vuoi scriverlo come risposta o dovrei? –

risposta

9

MongoDB utilizza la parte "query" per una query di upsert come parte del set, ovvero non è necessario specificare _id nella parte impostata di cui si desidera specificare il proprio _id.

nota: la mia query precedente aveva anche un piccolo bug che era il flag di upsert mancante.

Questa è la query corretta:

db.myCol.update({_id:12345},{$set:{myValue:'hi'}},{upsert:true}); 

Se il record non esiste, questa query sarà inserire un record che assomiglia a questo:

{_id:12345,myValue:'hi'} 
3

Davvero, questo è un bug in mongo risolto in versione di sviluppo 2.5.4 o 2.6.0 rilascio:

https://jira.mongodb.org/browse/SERVER-9958

Una volta risolto, credo che questo dovrebbe funzionare come desiderato. Nel caso generale, la query per l'aggiornamento non necessariamente specificherà un campo "_id".

+0

Se si tratta di un bug, è ancora presente in 3.4. Ho provato a utilizzare $ setOnInsert con {_id}, ma ha gettato la Mod su _id non mi è stato permesso. –

Problemi correlati