Estoy usando el marco Meteor con Blaze. ¿Cómo puedo obtener datos de una API y solo insertar datos nuevos en mi colección de MongoDB y no duplicados?
Obtención de datos de la API.
if (Meteor.isServer) { Meteor.methods({ fetchApiData: function () { this.unblock(); return Meteor.http.call('GET','http://jsonplaceholder.typicode.com/posts');},Insertar datos en la base de datos:
populateDatabaseApi: function () { Meteor.call('fetchApiData', function(error, result) { myCollection.insert({ //upsert: true, A: result.data.title, B: result.data.userId, C: result.data.id }); }); },Cuando se usa "myCollection.update" con "upsert: true", obviamente no inserta nuevas entradas. ¿Cuál es la mejor práctica para verificar la API en busca de datos e insertar SOLO entradas nuevas sin duplicados y actualizar las entradas existentes?
Gracias.
así es como manejo lo que llamo datos de referencia al inicio. se elimina de los datos JSON. debe elegir un campo que sirva como su "referencia" para cada objeto JSON, para que pueda ver si ya está en la base de datos.
_.each(ItemData.items, function(q) { check(q, ItemsSchema); Items.upsert({ item: q.item }, { $set: { item: q.item, } }, function(error, result) { if (error) { let errMsg = 'Error while writing item data'; console.error(errMsg, error); throw new Meteor.Error('500', errMsg); } }); });utilizo un upsert para manejar la inserción frente a la actualización.
No estoy familiarizado con su marco específico, por lo que no puedo ayudarlo con la sintaxis, pero debería poder encontrar todos los documentos con las mismas propiedades que el documento que está tratando de insertar (debe haber solo uno). Si hay uno, guárdelo usando upsert . Si no lo hay, entonces el objeto que está guardando es único y debe guardar uno nuevo.
Usando solo Meteor "vainilla", asumiendo que su objeto API tiene identificaciones únicas y que tiene el acceso a datos adecuado (es decir, si el elemento existe findOne lo encontraría), usaría:
populateDatabaseApi: function () { Meteor.call('fetchApiData', function(error, result) { var item = myCollection.findOne({A : result.data.id}) if(item){ //do nothing, this item already is in the db }else{ myCollection.insert({ A: result.data.title, B: result.data.userId, C: result.data.id }); }); } },