Necesito guardar un documento en una colección mongo.
Quiero guardar los campos de fecha 'insertedAt' y 'updatedAt', así que supongo que no puedo hacerlo en un solo paso...
Este es mi último intento:
my topic = new Topic(); // Topic is the model topic.id = '123'; // my univocal id, !== _id topic.author = 'Marco'; ... Topic.findOne({ id: topic.id }, function(err, doc) { if (err) { console.error('topic', topic.id, 'could not be searched:', err); return false; } var now = new Date(); if (doc) { // old document topic.updatedAt = now; } else { // new document topic.insertedAt = now; } topic.save(function(err) { if (err) { console.error('topic', topic.id, 'could not be saved:', err); return false; } console.log('topic', topic.id, 'saved successfully'); return true; }); });Pero así termino duplicando registros... :-(
¿Cualquier sugerencia?
En lugar de hacer lo que sea que esté haciendo, prefiero una forma muy fácil de actualizar el documento con upsert. Para esto, debe tener en cuenta que no use el modelo para crear una instancia para insertar. Necesita crear un objeto manualmente.
//don't put `updatedAt` field in this document. var dataToSave = { createdAt: new Date(), id: 1, author: "noor" ....... } Topic.update({ id: 123 }, { $set:{ updatedAt: new Date() }, $setOnInsert: dataToSave}, { upsert: true }, function(err, res){ //do your stuff here }) Esta consulta primero verificará si hay algún documento en la colección, en caso afirmativo, solo actualizará udpatedAt , de lo contrario, insertará todo el documento nuevo en la colección. Espero que esto responda a su consulta.
establezca las marcas de tiempo en falso en la definición del esquema y luego agregue los campos en la creación como desee.
Vea la definición de esquema de muestra a continuación:
var mongoose = require('mongoose') , Schema = mongoose.Schema; var Topic = new Schema({ id:{ type:String, required: true }, author:{ type:String, required: true } },{ timestamps: false });