2011-10-14 67 views
1

我有一種情況,即在夜間更新CMS(Sitecore)中的大量內容,必須在其中更新大量數據但只適用少數更新(大約有320,000個潛在領域,估計其實際值可能是3000個)。我想簡化它,只有當新值與當前值不同時纔會進行更新。通過這種方式,我希望能夠最小化進行更新後發生的重新索引的數量,並儘量減少隨後發佈的內容數量。僅在新值與當前值不同時更新屬性

這是什麼,我現在在做

langItem.Fields["Type"].Value = updateNode.SelectSingleNode("./Type").InnerText; 

一個例子,這就是我在尋找將其更改爲

if (langItem.Fields["Type"].Value != updateNode.SelectSingleNode("./Type").InnerText) 
    langItem.Fields["Type"].Value = updateNode.SelectSingleNode("./Type").InnerText; 

我覺得應該有某種的運營商,這將爲我照顧這個。我不認爲有,但如果有,請讓我知道它是什麼。有很多XPath查詢(我的所有數據都是XML),我覺得重複它們是浪費的,但爲它們創建變量也看起來很糟糕。此外,還有一些右手邊涉及方法調用的示例。我認爲在這些情況下爲結果創建變量是有道理的。

有哪些其他優化方法?

+0

有沒有辦法暫停重新索引? –

+0

@GertArnold我已經暫停了重新索引,但是一旦對數據進行了索引編制的更改。也就是說,您可以延遲重新索引,直到完成所有更新以加速更新過程,但數據需要在某個時間索引。 –

回答

0

那麼簡單的方法怎麼樣?

protected void UpdateIfChanged(Field field, string value) 
{ 
    if (field.Value != value) 
    { 
     field.Value = value; 
    } 
} 

UpdateIfChanged(langItem.Fields["Type"], updateNode.SelectSingleNode("./Type").InnerText); 

(上面的代碼未經測試)

你可以將其添加爲一個擴展方法來Field類以及如果你喜歡。

但是,不知道這實際上可以爲您節省多少性能。如果沒有字段發生變化,真的需要避免保存該項目,對嗎?可以通過從方法中返回一個bool來實現,如果任何字段返回true,就知道要保存該項目。

+0

我將以此作爲最接近的答案。我用你的方法的想法,不是很原始的,但我沒有想到它,然後我發佈我的問題,所以我不能抱怨。我將它與三元if-then?:操作符結合起來,當我調用它來保持代碼行數不變時。我確實通過按日期過濾來減少可能的數據變化,從而獲得了一些選擇權。我感覺這並不能真正讓我到達需要的地方,但希望能夠繼續工作,直到我有時間重新編寫代碼。 –

0

我能想到的唯一可能是使用Sitecore查詢語法嘗試選擇具有差異的項目。

例如(假設updateNode有一定的ID屬性是一樣的郎項)

var id = updateNode.SelectSingleNode("./Id").InnerText; 
var val = updateNode.SelectSingleNode("./Type").InnerText; 
var query = rootPathOfItems + "//*[@@id='{" + id + "} and @Type!='" + val + "']"; 
var item = Sitecore.Context.Database.SelectSingleItem(query); 
if (item != null) { 
    item.Editing.BeginEdit(); 
    item.Fields["Type"].Value = val; 
    item.Editing.EndEdit(); 
} 

從本質上講,你將只能得到一擊,因爲它有不同的價值的項目。我不確定數據是如何佈置的,所以也許你可以用某種方式調整查詢,但這可能會加速一些事情(如果沒有命中,則不需要填寫數據Item

+0

不錯,但是我的領域和項目的組合使這個行不通。 –