2014-10-18 43 views
1

我寫了一個雲作業,在用戶對象中插入用戶的名字和姓氏的小寫版本,以便我可以從我的客戶端應用程序執行搜索。解析後臺作業each()不會遍歷所有記錄?

當我在一個有40個用戶的開發者解析應用上運行這個工作時,它工作得很好。

當我在我的生產應用程序上運行此操作時,它並沒有更新我所有的記錄。我目前所面對的幾十萬用戶,我期待這個雲的工作按如下說明採取一切他們的照顧:

http://blog.parse.com/2013/05/13/launch-and-iterate-parse-data-migrations/

「上Parse.Query對象的新每種方法可以讓你做到這一點,即使你在一個集合中有數以萬計的對象或更多的對象,它也會返回它們中的每一個,給你一個機會來修改它們,只要你認爲合適。「

那麼我的問題是爲什麼這個函數會留下超過一半的數據庫?它只適用於一羣用戶,可能有幾百個。

如何使這個函數影響我的用戶表中的整數據集?

Parse.Cloud.job("migration1", function(request, status) { 
    // Set up to modify user data 
    Parse.Cloud.useMasterKey(); 
    // Query for all users 
    var query = new Parse.Query(Parse.User); 
    query.each(function(user) { 
     // Set and save the change 
     var firstname = user.get("firstname"); 
     if(firstname) { 
     user.set("searchfirstname", firstname.toLowerCase()); 
     } else { 
     user.set("searchfirstname", "");  
     } 
     var lastname = user.get("lastname"); 
     if(lastname) { 
     user.set("searchlastname", lastname.toLowerCase()); 
     } else { 
     user.set("searchlastname", ""); 
     } 
     return user.save(); 
    }).then(function() { 
    // Set the job's success status 
    status.success("search migration completed successfully."); 
    }, function(error) { 
    // Set the job's error status 
    status.error("Uh oh, something went wrong with search migration"); 
    }); 
}); 

編輯: 好了,所以當我看到錯誤日誌中我看到這一點:

E2014-10-18T15:48:49.984Z] v63: Ran job searchMigration with: 
    Input: {} 
    Failed with: TypeError: Cannot call method 'toLowerCase' of undefined 

我試圖以任何方式我能想到的檢查不確定的,我仍然得到了同樣的問題。 我試圖檢查未定義的是這樣的:

if(lastname === undefined || lastname === void 0 || typeof lastname == 'undefined') ... 

我還是得到了一個未定義的錯誤的結果與toLowerCase,我認爲這就是爲什麼工作不影響我的所有用戶表,因爲它停止...

有什麼建議嗎?

回答

1

所以,我終於想通了,爲什麼工作沒經過的所有記錄,但經過幾次的記錄「隨機」將停止......

我對用戶的AfterSave掛鉤,在觸發上述工作的每次迭代... 在保存之後,它會在時間上產生錯誤並使作業失敗。

因此,出於某種原因,我認爲在保存鉤子後,並沒有通過在用戶內部進行保存而觸發。

就是這樣。現在一切正常。