2012-11-03 89 views
5

流星命令多久才能在Meteor中實現?流星等值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()在同一時間,然後用'{標題:「富」}兩個文件'會被創建。 –

+0

沒錯,然後一個流星的upsert實現將是理想的。因爲如果兩個客戶端以相同的數據運行upsert,他們會在其客戶端模擬分貝上創建單個文檔;那麼流星將在服務器上運行時同步這兩個文檔。它可能會有點毛,但是...我可以看到爲什麼它還沒有實現。 – tom

回答

5

如何儘快將更新插入命令流星實施?

更新:現在支持@Thomas4019指出upsert

v0.6.6

「添加UPSERT支持Collection.update現在支持{UPSERT:真正}。選項此外,加Collection.upsert方法返回新插入的對象標識符(如果適用)。「

來源:History.md

使用文檔:http://docs.meteor.com/#upsert

- 原來的答案如下 -

上有Trello流星路線圖的卡片,你可以投票,表示對你的重要性:https://trello.com/c/C91INHmj

它是目前在這意味着它將需要一段時間才執行,除非它收到大量選票的「後來」名單。

需要注意的另一個重要的一點是,由於流星是開源的,你可以自己實現必要的修改,並提交回來。


什麼是做同樣的事情在平均時間的最好方法?

有幾種解決方案,但最適合您的使用情況是不可能告訴你沒有更多的設計知識。

  1. 爲的就是使用代碼,添加一個唯一索引到集合,如果/當它出現

  2. 更改設計來實現明確的樂觀併發處理重複鍵錯誤。

這兩種解決方案的核心都是一樣的,優雅地處理錯誤情況。 #1更容易實施。 #2允許在樂觀併發處理方式方面有更大的靈活性。

+1

現在內置Upsert功能。 – Thomas4019

0

如果你真的想這樣做,你可以直接使用MongoDB的連接:MongoInternals.defaultRemoteCollectionDriver().mongo.db.collection('myCollection').update(query, update, {upsert: true})。當然這個連接沒有記錄,所以有可能在將來改變它。

0

的Upsert是這一招真的很容易。你只是檢查它是否有一個_id屬性:

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