2012-06-25 2 views
7

questo è il formato del mio documento: Come incrementare campi oggetto documento MongoDB all'interno una serie

{ 
    _id: some id, 
    name: 'some name', 
    versions: [] 
} 

Nel campo versions posso conservare oggetti come {v: '2.5', count: 5} dove count detiene il numero di volte che una versione è in uso .

Qual è il modo più semplice per eseguire quanto segue?

  1. inserire un nuovo oggetto all'interno della matrice versions se non esiste
  2. Ff una particolare versione esiste all'interno della matrice versions quindi incrementare la sua count

risposta

10

più semplice modo essere dovrebbe essere,

db.collection.update({versions.v:'some_version'},{"$inc":{"versions.$.count":1}}); 

Questo incrementerà il conteggio se vers esiste, ma come dice la documentazione di MongoDB, l'operatore $ non può essere mischiato con upsert, quindi la query sopra riportata non darà esito se l'errore {versions.v:'some_version'} fallisce.

L'operatore di posizione non può essere combinato con un upsert poiché esso richiede un elemento di matrice corrispondente. Se il tuo aggiornamento risulta in un inserto allora il "$" sarà letteralmente usato come nome del campo.

Di seguito sono riportati i biglietti JIRA per sostenere up con $. Puoi votare e guardare questi problemi.

Upsert with $-positional operator can create bad documents

Support $ positional operator with an upsert