tengo una serie de registros como MongoDB:MongoDB: Insertar registro si no existe, si lo hace caso omiso de
{"name":"Bob", "gpa":4}
{"name":"Sarah", "gpa":3}
voy a encontrar varios registros adicionales que pueden o no pueda estar relacionada a las mismas personas Quiero aceptarlos si son personas nuevas, y no actualizarlos si son personas que hemos visto antes. Entonces, si obtengo {"name":"Jim", "gpa":2}
, quiero aceptarlo tal como está. Si obtengo {"name":"Sarah", "gpa":4}
(diferente valor de GPA), quiero simplemente ignorarlo. Esta no parece ser la lógica de update
con "upsert" establecido en yes, o de findAndModify
con "upsert".
https://stackoverflow.com/a/3260290/514757 sugiere una manera (índice único en el primer campo, inserte el registro, actualice inmediatamente el segundo campo) pero tiene algunos años y me pregunto si ahora hay una mejor manera de hacerlo en un solo paso .
EDIT:
La respuesta aceptada parece muy bien, pero que no funciona para mí! En primer lugar, he creado el índice (esto es con el conductor de Java):
nameIndex.put("name", 1);
nameIndex.put("unique", true);
queue.ensureIndex(nameIndex);
que puedo ver desde la línea de comandos que existe el índice y es único. A continuación, se inserta un artículo:
DBObject person = new BasicDBObject();
person.put("name", "Bob");
person.put("score", 200000);
queue.insert(person);
Más adelante, el artículo con la puntuación más alta tiene su puntuación reduce a cero:
BasicDBObject reset = new BasicDBObject();
reset.put("$set", new BasicDBObject("score", 0));
DBObject dbObj = queue.findAndModify(null, new BasicDBObject("score", -1), reset);
Todo esto funciona según lo previsto! Pero, más tarde, se puede encontrar el mismo nombre nuevamente, con una nueva puntuación. Cuando esto último bit de código se ejecuta, un nuevo elemento se crea con una puntuación diferente, que es exactamente lo que no quiero:
BasicDBObject queueable = new BasicDBObject();
queueable.put("name", "Could be Bob again, could be someone new");
queueable.put("score", 1234);
queue.insert(queueable);
Si busco para Bob, me parece:
{ "_id" : ObjectId("4f5e865ad6d09315326ea0f0"), "score" : 0, "name" : "Bob" }
{ "_id" : ObjectId("4f5e8691d6d09315326ea190"), "name" : "Bob", "score" : 886 }
Se ha creado un segundo registro, con el puntaje más alto nuevamente. ¿Importa el orden de los campos? No parece que debería, y no sé cómo controlar eso.
el orden de los campos no importa.Si resuelve su llamada de EnsureIndex por la respuesta de @tripvolpe a continuación, debería resolver su problema. por favor acepte la respuesta del viaje si lo hace. – ericsoco