2017-01-16 75 views
1

我在Blaze使用Meteor框架。我如何从API获取数据并只在MongoDB集合中插入新数据而不重复?如何更新没有重复的MongoDB

  1. 从API获取数据。

    if (Meteor.isServer) { 
        Meteor.methods({ 
         fetchApiData: function() { 
          this.unblock(); 
          return Meteor.http.call('GET','http://jsonplaceholder.typicode.com/posts');}, 
    
  2. 将数据插入数据库:

    populateDatabaseApi: function() { 
        Meteor.call('fetchApiData', function(error, result) { 
        myCollection.insert({ 
         //upsert: true, 
         A: result.data.title, 
         B: result.data.userId, 
         C: result.data.id }); 
        }); 
    }, 
    

当使用 “myCollection.update” 与 “UPSERT:真正的” 它并不明显插入新的条目。什么是最好的做法来检查API的数据和只插入新的条目没有重复和更新现有的条目?

谢谢。

+1

如果你需要保证唯一性,你应该在数据库中放置适当的唯一索引,如果没有它们,你在流星中做的任何事情都可能失败。 – Paul

+0

为什么不用[Collection.upsert()](https://docs.meteor.com/api/collections.html#Mongo-Collection-upsert)这个简单的方法来做到这一点? –

回答

0

我不熟悉你的具体框架,所以我不能用语法帮助,但你应该能够找到与相同属性,你想插入文档的所有文件(应只有一个)。如果有,使用upsert保存。如果没有,那么你保存的对象是唯一的,你应该保存一个新的。

+0

不知道我理解正确。我是否必须将标题与数据库中现有条目进行比较? – user3323307

+0

如果'title'是集合中的唯一字段,那么是的,您可以简单地比较标题(或任何其他单个唯一字段,或两个一起使文档唯一的字段)。但是,如果没有唯一字段,那么您必须询问数据库是否有与您要保存的文档相同的整个文档(自动生成的sans'id','__v'等字段) – Corbfon

1

这里是我如何处理启动时我所说的参考数据。它是由JSON数据驱动的。您必须选择一个字段作为每个JSON对象的“参考”,以便您可以查看它是否已经在数据库中。

_.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); 
     } 
    }); 
}); 

我使用upsert处理插入与更新。

0

只使用“香草”流星,假设你的API对象有唯一的ID和你有适当的数据访问(即,如果项目存在findOne会找到它),我会用:

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 }); 
      }); 
     } 
    },