2017-01-16 2 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" を使用している場合、それは明らかに新しいエントリを挿入しません。データのAPIをチェックし、重複のない新しいエントリのみを挿入して既存のエントリを更新するのがベストプラクティスですか?

ありがとうございます。

+1

の場合一意性を保証する必要がある場合は、DBに適切な一意のインデックスを配置する必要があります。流星で行うことは、それらなしで失敗する可能性があります。 – Paul

+0

[Collection.upsert()](https://docs.meteor.com/api/collections.html#Mongo-Collection-upsert)を使って単純な方法で行うのはなぜですか? –

答えて

0

私はあなたの特定のフレームワークに精通していないので、私は構文を助けることはできませんが、と同じプロパティを持つすべてのドキュメントを見つけることができるはずです1つだけです)。存在する場合は、upsertを使用して保存します。存在しない場合、保存しているオブジェクトは一意であり、新しいオブジェクトを保存する必要があります。

+0

私は正しく理解しています。タイトルのようなものをデータベースの既存のエントリと比較する必要がありますか? – user3323307

+0

'title'がコレクション内の一意のフィールドであれば、タイトル(または他の単一の一意のフィールド、またはドキュメントを一意にする2つのフィールド)を単純に比較できます。しかし、一意のフィールドがない場合は、保存しようとしているドキュメント全体が存在するかどうかをデータベースに問い合わせる必要があります( 'id'、' __v'などのフィールドは自動的に生成されます) – Corbfon

1

ここで私は起動時に参照データと呼ばれるものを処理します。それはJSONデータから排除されています。各JSONオブジェクトの "参照"としての役割を果たすフィールドを選択する必要があります。そのフィールドがすでにdbにあるかどうかを確認することができます。

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

iは更新対挿入を処理するためにアップサートを使用しています。あなたのAPIオブジェクトを想定し、唯一の「バニラ」流星を使用

0

固有の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 }); 
      }); 
     } 
    }, 
関連する問題