2013-03-09 26 views
0

我有一個函數可以存儲大量數據,然後在存儲更多數據之前檢查數據是否有重複。查詢每個重複檢查的數據庫會導致腳本超出最大執行時間,因此查詢整個數據庫,然後檢查該查詢。問題是,當我通過重複檢查運行時,查詢大小在第四次通過時減小到零,使其無效。下面是存儲功能的代碼,並重複檢查:ScriptDb遞減查詢

function ssToScriptDb_1() { 
    var spreadsheet = SpreadsheetApp.openById('0Ah1c1zmu5vU_dEZJYVMzVnF6Y211cmJGdjZBUGFLQWc'); // **** create a function to prompt for the ID 
    var sheet = spreadsheet.getActiveSheet(); 
    var columns = spreadsheet.getLastColumn(); 
    var data = sheet.getDataRange().getValues(); 
    var keys = data[0]; 
    var db = ScriptDb.getMyDb(); 
    var allDb = db.query({}); 
    var items = []; 
    for (var row = 1; row < data.length; row++) { 
    var rowData = data[row]; 
    var item = {}; 
    for (var column = 0; column < keys.length; column++) { 
     item[keys[column]] = rowData[column]; // ???? could I use this notation in place of the double for loops in timeClock? 
    } 
    item.visitDate = Utilities.formatDate(item.visitDate, "MST", "M/d/yyyy"); 

    // check to see if the item is already in the db 
    if (dupCheck(db, allDb, item)) { 
     items.push(item); 
    } 
    if (row % 1000 == 0) { 
     Logger.log("row " + row + " completed at " + new Date() +"\n"); 
    } 
    } 

    var itemsLen = items.length; 
    Logger.log('DB save start time ' + new Date() + '\n'); 
    var results = db.saveBatch(items, false); 
    Logger.log('DB save end time ' + new Date() + '\n'); 
} 

function dupCheck(db, query, item) { 
    var count = 0; 
    var querySize = query.getSize(); 
    var query2Size = db.query({}).getSize(); 
    while (query.hasNext()) { 
    var ob = query.next(); 
    if (ob.ID == item.ID && ob.email == item.email && ob.visitDate == item.visitDate) { 
     return false; 
    } 
    count++; 
    } 
    return true; 
} 

首次通過調試dupCheck()看起來是這樣的: dupCheck() pass 1

通知,querySize是進入dupCheck()和query2Size是之前完成的查詢在dupCheck()內完成相同的查詢。

這裏是第二次通過dupCheck()dupCheck() pass 2

這裏是第4關: dupCheck() pass 4

再次注意到querySize VS query2Size

我不知道是什麼導致原始查詢減少,但我不能調用每個項目的查詢,任何想法是什麼導致這個或有更好的解決方案?

回答

0

我想通了。我沒有意識到query.next()正在改變查詢。爲了實現我所需要的功能,我把查詢結果放在一個數組中,並檢查數組中的重複項。