2015-06-11 79 views
2

我想更新的卡桑德拉一個字段,用幻影斯卡拉SDK像索引:如何更新索引的字段?

this.update.where(_.id eqs folderId) 
     .and(_.owner eqs owner) 
     .modify(_.parent setTo parentId) 

父字段是在表中的索引字段。但操作是不允許當編譯代碼,就會有這樣的編譯例外:

[error] C:\User\src\main\scala\com\autodesk\platform\columbus\cassandra\DataItem.scala:161: could not find implicit value for evidence parameter of type com.websudos.phantom.column.ModifiableColumn[T] 

錯誤是由更新其索引的字段造成的。

我的解決方法是刪除記錄並插入新記錄以「更新」記錄。

有沒有更好的方法來處理這種情況?

回答

2

您不允許更新屬於主鍵的字段,因爲如果您這樣做,則表示Cassandra無法重新組合正在更新的行的散列。

閱讀here瞭解有關該主題的詳細信息。實質上,如果你有一個HashMap[K, V]你試圖做的是更新K,但這樣做你將永遠無法再次檢索相同的V

所以在卡桑德拉,就像在HashMap,一個更新的索引與DELETE,然後一個新的INSERT完成。這就是幻影故意阻止你編譯你的查詢的原因,爲了防止無效的CQL的特定目的,我編寫了這些編譯時間限制。

+0

因此,除了刪除和添加,沒有其他方法。由於刪除和添加是兩個操作,有沒有辦法使這兩個操作在原子上執行? – wherby

+0

@wherby不,你仍然需要採用普通的卡桑德拉方式。刪除將導致墓碑等,正常的方式。是的,你可能仍然有殭屍,但理想情況下更新後,你再也不會查詢原始ID。另外,您可以控制一致性來解決這個問題。 – flavian

+1

您可以使用'記錄的批次'爲刪除+插入操作提供某種「輕量級事務」。 – shutty