2012-11-03 9 views
5

メテオではどのくらいupsertコマンドがすぐに実装されますか?メテオupsert相当物

そして、その間に同じことを行うための最善の方法は何ですか?

if typeof (item = Items.findOne({title:'Foo'})) == 'undefined' 
    item = Items.insert({title:'Foo'}) 
else 
    Items.update(item._id, {$set: {title:'Foo'}}) 
# do something with item 
+2

を、注意して二つの別々のクライアントが同時に()findOneを実行した場合{「foo」でタイトル}'との二つの文書、その作成される。 –

+0

真実であれば、アップセートの流星の実装が理想的です。 2つのクライアントが同じデータを使ってupsertを実行すると、クライアントのシミュレートされたdbに個々のドキュメントが作成されます。流星は2つの文書をサーバー上で実行するときにそれらを同期させます。しかし、少し毛深いかもしれません...なぜ私はそれがまだ実装されていないか見ることができます。 – tom

答えて

5

がどのようにすぐにアップサートコマンドは流星で実装されます。このような

何かが、私は現時点ではやっているのですか?

UPDATE:そのupsertアウト@Thomas4019ポイントがサポートされるようになりました:

v0.6.6

は「アップサートのサポートを追加Collection.updateは今{アップサート:真}をサポートしています。。オプションをさらに追加該当する場合は、新しく挿入されたオブジェクトIDを返すCollection.upsertメソッド。 "

出典:History.md

使用法のドキュメント:http://docs.meteor.com/#upsert

- オリジナルの答えは次の -

あなたはあなたにその重要性を示すために投票することができるTrello流星ロードマップ上のカードがあります:https://trello.com/c/C91INHmj

それが票をたくさん受けていない限り、それが実装される前に、それはしばらくのことを意味し、「その後」リストに現在あります。

注意すべき他の重要なことは、流星は、オープンソースであるため、自分で必要な変更を実装し、バック提出することができることです。


平均時間に同じことを行うための最善の方法は何ですか?

いくつかの解決方法がありますが、使用方法に最も適しているものは、設計についての知識がなければ分かりません。

  1. 、そのままのコードを使用してコレクションに一意のインデックスを追加し、/場合には、明示的な楽観的同時実行を実現するために

  2. 変更設計を生じた場合、重複キーエラーを処理します。

これらのソリューションの両方のコアは同じですが、エラーのケースを適切に処理します。 #1は実装が簡単です。 #2では、オプティミスティックな並行処理の柔軟性が向上します。 MongoInternals.defaultRemoteCollectionDriver().mongo.db.collection('myCollection').update(query, update, {upsert: true}):あなたは本当にそれをしたい場合は

+1

Upsert機能が組み込まれました。 – Thomas4019

0

は、あなたが直接、MongoDBの接続を使用することができます。もちろん、この接続は文書化されていないので、将来変更される可能性があります。

0

アップサートは、このトリックと本当に簡単です。あなたはそれが_idプロパティがあるかどうかを確認: `意志:あなたのソリューションでは

if(item._id){ 
    //update 
}else{ 
    //insert 
}