ho una serie di record MongoDB come:MongoDB: inserire record se non esiste, ignora se lo fa
{"name":"Bob", "gpa":4}
{"name":"Sarah", "gpa":3}
farò incontrare vari record aggiuntivi che possono o non può riguardare alle stesse persone Voglio accettarli se sono nuove persone e non aggiornarli se sono persone che abbiamo visto prima. Quindi se ottengo {"name":"Jim", "gpa":2}
, voglio accettarlo così com'è. Se ottengo {"name":"Sarah", "gpa":4}
(diverso valore GPA), voglio semplicemente ignorarlo. Questa non sembra essere la logica di update
con "upsert" impostato su yes o di findAndModify
con "upsert".
https://stackoverflow.com/a/3260290/514757 suggerisce un modo (indice univoco sul primo campo, inserisci record, aggiorna immediatamente il secondo campo) ma ha qualche anno e mi chiedo se non c'è un modo migliore ora per farlo in un unico passaggio .
EDIT:
La risposta accettata sembra grande, ma non funziona per me! In primo luogo, ho creato l'indice (questo è con il driver Java):
nameIndex.put("name", 1);
nameIndex.put("unique", true);
queue.ensureIndex(nameIndex);
posso vedere dalla riga di comando che esiste l'indice ed è unico. Poi, un elemento viene inserito:
DBObject person = new BasicDBObject();
person.put("name", "Bob");
person.put("score", 200000);
queue.insert(person);
In seguito, l'elemento con il punteggio più alto è il punteggio ridotto a zero:
BasicDBObject reset = new BasicDBObject();
reset.put("$set", new BasicDBObject("score", 0));
DBObject dbObj = queue.findAndModify(null, new BasicDBObject("score", -1), reset);
Tutto questo funziona come previsto! Ma, più tardi, lo stesso nome può essere trovato di nuovo, con un nuovo punteggio. Quando questo ultimo pezzo di codice viene eseguito, un nuovo elemento viene creato con un punteggio diverso, che è esattamente quello che non voglio:
BasicDBObject queueable = new BasicDBObject();
queueable.put("name", "Could be Bob again, could be someone new");
queueable.put("score", 1234);
queue.insert(queueable);
Se cerco Bob, trovo:
{ "_id" : ObjectId("4f5e865ad6d09315326ea0f0"), "score" : 0, "name" : "Bob" }
{ "_id" : ObjectId("4f5e8691d6d09315326ea190"), "name" : "Bob", "score" : 886 }
Un secondo record è stato creato, con il punteggio più alto di nuovo. L'ordine dei campi è importante? Non sembra come dovrebbe, e non so come controllarlo.
l'ordine dei campi non importa.fissare la tua chiamata in assurance per la risposta di @tripvolpe di seguito dovrebbe risolvere il tuo problema. per favore accetta la risposta di viaggio se lo fa. – ericsoco