[英]ScriptDB: Custom ID for record for quick bulk updating?
我有20,000條記錄的ScriptDB產品信息,我希望每隔一個小時用當前的價格/庫存信息進行更新。 從目前的情況來看,我在設計某些東西時很難遇到執行限制。
下載的stockfile是可自定義的,目前我將其作為JSON,例如:
[
{"sku":"MYSKU1","price":14.99,"qty":2},
{"sku":"MYSKU2","price":22.99,"qty":25},
{"sku":"MYSKU3","price":91.99,"qty":31}
]
目前,我正在執行以下操作:
var prod_feed = UrlFetchApp.fetch("https://www.site.com/myJSONfile").getContentText();
var prod_data = JSON.parse(prod_feed);
var prod_qty = 0, i = 0;
var prod_code = "";
var prod_price = "";
var db = ScriptDb.getMyDb();
var result_array = [];
var result_current = {};
var time_obj = dbDateObject();
for(i = 0; i < prod_data.length; i++) {
var result = db.query({sku: prod_data[i]["sku"]}).next(); // result will be null if no match
if (!result) {
// No match, create new object with this SKU for insertion
result = {};
result["sku"] = prod_data[i]["sku"];
}
result["qty"] = prod_data[i]["qty"];
result["price_default"] = prod_data[i]["price"];
result["last_product_update"] = time_obj;
result_array[i] = result;
}
var results = db.saveBatch(result_array, false);
在達到時間限制之前,我可以以此方式瀏覽大約2500條記錄並保存它們。
有什么方法可以直接將SKU用作記錄ID? 那么實際上是三行代碼...
var prod_feed = UrlFetchApp.fetch("https://www.site.com/myJSONfile").getContentText();
var prod_data = JSON.parse(prod_feed);
var results = db.saveBatch(prod_data, false);
如果沒有,有什么明顯的方法可以提高效率?
謝謝!
如果您要達到6分鍾的運行時間限制,則只需(a)使您的工作成為冪等,然后(b)一次又一次運行它,直到完成工作。
方法(a)-您可以“記住”您要使用的sku或將其作為電子表格中的Lineitem,然后添加“完成”列。
要執行(b),在您的主循環中,如果您的時間超過5分鍾且少於6分鍾,則可以退出並重新安排作業以在10分鍾內再次運行(或更少,但是您需要鎖)。
有什么方法可以直接將SKU用作記錄ID?
可悲的是沒有。 Every ScriptDb object has an id, assigned by the system when it is stored, which is an opaque, immutable string value.
( ScriptDb文檔 。)
但是,您可以將產品存儲在單個對象中,而不必使用對象數組,而將SKU用作對象屬性。 您仍然需要遍歷輸入,但是只有兩次調用ScriptDB服務,而不是數千次調用。
嘗試這個:
var prod_feed = UrlFetchApp.fetch("https://www.site.com/myJSONfile").getContentText();
var prod_data = JSON.parse(prod_feed);
var db = ScriptDb.getMyDb();
var result = db.query({type: "products"});
var products = {};
if (result.hasNext()) {
// Projects database object already exists
products = result.next();
}
else {
// Not found, so create the Projects database object.
var product_data = new Object();
products = {type: "products", data: product_data};
}
var time_obj = dbDateObject();
for (var i = 0; i < prod_data.length; i++) {
if (!(prod_data[i]["sku"] in products.data)) {
// No match, create new object with this SKU for insertion
products.data[prod_data[i]["sku"]] = {};
}
// Update info for this item
var item = products.data[prod_data[i]["sku"]];
item.qty = prod_data[i].qty;
item.price_default = prod_data[i].price;
item.last_product_update = time_obj;
}
var results = db.save(products);
這是調試器的屏幕截圖,顯示了從ScriptDb中檢索到的“產品”對象的外觀。 如果您可以稍微調整一下輸入數據,則可能能夠獲得您夢dream以求的一次性寫入!
注意:我已經像您一樣使用過price
和price_default
,但是我懷疑這是一個錯字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.