1

我正在大型数据集上运行脚本以扩展现有信息。例如:

...
{
    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。

4

2 回答 2

2

都想通了。MongoDB 在 shell 版本 2.4.1 之前有一个错误,它允许为查询结果对象设置重复的元素名称。本周一发布的 2.4.3 版有一个修复程序。请参阅https://jira.mongodb.org/browse/SERVER-9066

于 2013-04-24T13:48:52.980 回答
1

我真的不明白你的问题。如果您在 ECMAscript 中将相同的属性名称应用于对象,则该属性将被覆盖。您的代码段中的构造永远不能以这种形式存在于活动对象(不包括 JSON 字符串)上。

如果您只想检测创建已经存在的属性的尝试,则需要事先缓存该对象引用(以便循环其键)-或者-您需要应用ES5 strict mode

"use strict";

在文件或函数的顶部。这将确保您的解释器在尝试创建两个相同的属性键时会抛出异常。当然,您可以使用try - catch语句来拦截该故障。

似乎您无法拦截由于严格模式违规而引发的错误。

于 2013-04-23T14:48:59.557 回答