2014-10-18 99 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挂钩,在触发上述工作的每次迭代... 在保存之后,它会在时间上产生错误并使作业失败。

因此,出于某种原因,我认为在保存钩子后,并没有通过在用户内部进行保存而触发。

就是这样。现在一切正常。