我正在大型数据集上运行脚本以扩展现有信息。 e.g:
...
{
id : 1234567890
},
{
id : 1234567891
},
...
变为
...
{
id : 1234567890,
Name : "Joe"
},
{
id : 1234567891,
Name : "Bob"
},
...
我通过以下代码执行此操作:
for(var cur in members)
{
curMember = members[cur];
// fetch account based on curMember.id to 'curAccount'
if(curAccount != null)
{
curMember.DisplayName = curAccount.DisplayName;
}
}
在大多数情况下,这可以按预期工作。但是,有一段时间(数万个条目的顺序),结果如下所示:
...
{
id : 1234567891,
Name : "Bob",
Name : "Bob"
},
...
我现在的数据格式无效且数据库无法读取,因为重复的属性名称没有意义。当重新运行脚本时,它会随机输入,而不是每次都是相同的。我需要一种方法来防止这种情况发生,或者检测它已经发生了所以我可以简单地重新处理该条目。有谁知道这里发生了什么?
编辑:经过进一步调查后,只有当被修改的对象来自MongoDB查询时才会出现问题。似乎如果代码多次将值显式设置为相同的元素名称,则该字段将被复制。所有相同名称的元素似乎都设置为最近指定的值。如果它仅在原始问题中分配一次,则它很少被复制。我使用的是MongoDB 2.4.1。
答案 0 :(得分:2)
一切都弄清楚了。 MongoDB有一个bug版本到shell版本2.4.1,它允许为查询结果对象设置重复的元素名称。本周一发布的版本2.4.3有一个修复。请参阅https://jira.mongodb.org/browse/SERVER-9066。
答案 1 :(得分:1)
我真的不明白你的问题。如果将相同的属性名称应用于ECMAscript中的对象,则该属性将被覆盖。您的代码段中的构造永远不会以实时对象(不包括JSON字符串)的形式存在。
如果您只想检测尝试创建已经存在的属性,您需要预先缓存该对象引用(这样您可以循环其键) - 或 - 您需要应用 ES5严格模式。
"use strict";
位于文件或功能的顶部。这将确保您的解释器将尝试创建两个相同的属性键。 当然,您可以使用 try - catch
语句拦截该失败。
似乎你无法拦截因严格模式违规而被抛出的错误。