2011-01-03 4 views
21

Viene visualizzato un errore "Duplicazione del nome del campo non consentita con i modificatori" durante il tentativo di aggiornamento di un campo (o campi) in Mongo. Un esempio:"Duplicazione del nome del campo non consentita con i modificatori" sull'aggiornamento

> db.test.insert({test: "test1", array: [0]}); 
> var testFetch = db.test.findOne({test: "test1"}); 
> db.test.update(testFetch, 
       {$push: {array: 1}, //push element to end of key "array" 
        $pop: {array: -1} //pop element from the start of key "array" 
       }); 
    Field name duplication not allowed with modifiers 

Non c'è un modo per eseguire questa operazione atomica? Non voglio fare due aggiornamenti separati per questo.

+0

Questo è stato il primo risultato di Google quando ho avuto questo errore. Il mio problema, utilizzando mangusta, si è rivelato essere questo: https://github.com/LearnBoost/mongoose/issues/1933 – Abby

risposta

13

C'è un problema in sospeso per questo il sistema di ticket di Mongo: http://jira.mongodb.org/browse/SERVER-1050

sembra che sia in programma per quest'anno. Il tuo scenario è sicuramente uno scenario sensato, ma è anche legato a una serie di casi limite. Cosa succede se si $push e $pop su un array vuoto? Cosa è previsto? Cosa vuoi se si $push e $pull?

Non voglio eseguire due aggiornamenti separati per questo.

So che fare questo ha davvero "odore di codice", ma è un blocco completo per l'utilizzo di questa soluzione? Il "doppio aggiornamento" sta andando a distruggere completamente le prestazioni del server?

+2

Ho riscontrato lo stesso errore. Penso che il problema del "doppio aggiornamento" qui sia un problema serio, data la natura dell'atomicità di MongoDB. Se hai più applicazioni che potrebbero aggiornare la stessa parte di un array, davvero non vuoi $ pull in un'operazione, poi $ push in un altro ... tra i due qualche altro processo potrebbe aver cambiato lo stesso elemento dell'array, che potrebbe causare un comportamento cattivo/imprevisto. – jrista

+0

Sono d'accordo, qui potrebbero esserci problemi di dati. Ma dipende davvero dal motivo per cui stai facendo '$ push/$ pull'. In alcuni casi stai solo creando un array di code e l'ordine potrebbe non essere * quello * un grosso problema. Basato sul ticket JIRA, è ovviamente un problema popolare (* 53 voti *), ma è anche contrassegnato come minore e non programmato. Al ritmo attuale di sviluppo questo probabilmente non vedrà la luce del giorno per molti mesi. Ciò significa che, per far funzionare tutto ciò, è necessario risolvere tutti i casi limite. –

+2

In realtà ho trovato una soluzione mentre tentavo di risolvere i problemi di concorrenza. Le ultime versioni di MongoDB supportano FindAndModify e accoppiate con l'identificativo $ array (che rappresenta l'elemento dell'array attualmente trovato), è possibile trovare e aggiornare un determinato elemento array di un documento in una singola operazione che credo sia atomica. Per lo meno, l'operazione viene completata correttamente senza errori e dobbiamo ancora riscontrare un problema di concorrenza. ;) – jrista

Problemi correlati