2017-01-16 77 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 }); 
      }); 
     } 
    },