javascript - node - Mangosta: cree un documento si no existe, de lo contrario, actualice el documento de devolución en ambos casos
nestjs login (1)
Está buscando el new
parámetro de opción. La new
opción devuelve el documento recién creado (si se crea un documento nuevo). Úselo así:
var query = {},
update = { expire: new Date() },
options = { upsert: true, new: true, setDefaultsOnInsert: true };
// Find the document
Model.findOneAndUpdate(query, update, options, function(error, result) {
if (error) return;
// do something with the document
});
Como upsert
crea un documento si no encuentra un documento, no necesita crear otro manualmente.
Estoy buscando una forma de refactorizar parte de mi código para que sea más corto y más simple, pero no conozco muy bien a Mongoose y no estoy seguro de cómo proceder.
Estoy intentando verificar una colección por la existencia de un documento y, si no existe, crearlo. Si existe, necesito actualizarlo. En cualquier caso, necesito acceder al contenido del documento después.
Lo que he logrado hasta ahora es consultar la colección de un documento específico y, si no se encuentra, crear un documento nuevo. Si se encuentra, lo actualizo (actualmente usando fechas como datos ficticios para esto). Desde allí puedo acceder al documento encontrado de mi operación de find
inicial o al documento recientemente guardado, y esto funciona, pero debe haber una forma mejor de lograr lo que busco.
Aquí está mi código de trabajo, sin extras que distraen.
var query = Model.find({
/* query */
}).lean().limit(1);
// Find the document
query.exec(function(error, result) {
if (error) { throw error; }
// If the document doesn''t exist
if (!result.length) {
// Create a new one
var model = new Model(); //use the defaults in the schema
model.save(function(error) {
if (error) { throw error; }
// do something with the document here
});
}
// If the document does exist
else {
// Update it
var query = { /* query */ },
update = {},
options = {};
Model.update(query, update, options, function(error) {
if (error) { throw error; }
// do the same something with the document here
// in this case, using result[0] from the topmost query
});
}
});
He findOneAndUpdate
y otros métodos relacionados, pero no estoy seguro de si se ajustan a mi caso de uso o si entiendo cómo usarlos correctamente. ¿Alguien puede señalarme en la dirección correcta?
(Probablemente) Preguntas relacionadas:
- Cómo verificar si esos datos ya existen en la base de datos durante la actualización (Mongoose And Express)
- Mongoose.js: cómo implementar crear o actualizar?
- NodeJS + Mongo: Insertar si no existe; de lo contrario, actualizar
- Devuelva la colección actualizada con Mongoose
Editar
No me encontré con la pregunta que se me indicó en mi búsqueda, pero después de revisar las respuestas, se me ocurrió esto. Ciertamente es más bonito, en mi opinión, y funciona, así que a menos que esté haciendo algo horriblemente mal, creo que mi pregunta probablemente pueda cerrarse.
Agradecería cualquier aporte adicional sobre mi solución.
// Setup stuff
var query = { /* query */ },
update = { expire: new Date() },
options = { upsert: true };
// Find the document
Model.findOneAndUpdate(query, update, options, function(error, result) {
if (!error) {
// If the document doesn''t exist
if (!result) {
// Create it
result = new Model();
}
// Save the document
result.save(function(error) {
if (!error) {
// Do something with the document
} else {
throw error;
}
});
}
});