MongoError:key$不能以'$';存储xml2js模块生成的JSON对象时

MongoError:key$不能以'$';存储xml2js模块生成的JSON对象时,json,xml,node.js,mongodb,node-mongodb-native,Json,Xml,Node.js,Mongodb,Node Mongodb Native,各位, MongoDB db.version() is 3.0.5 mongodb package.json shows 2.0.42 version xml2js package.json shows 0.4.9 version 我已经在谷歌上搜索了错误,并通读了所有现有的问题,没有一个与我的情况相匹配(既不是,也不是g,等等)。这可能与mongodb本机驱动程序(或mongodb服务器版本)、xml2js或其他相关 我做了很多测试,并找到了解决问题的方法,但我很想知道问题出在哪里 我有

各位,

MongoDB db.version() is 3.0.5
mongodb package.json shows 2.0.42 version
xml2js package.json shows 0.4.9 version  
我已经在谷歌上搜索了错误,并通读了所有现有的问题,没有一个与我的情况相匹配(既不是,也不是g,等等)。这可能与mongodb本机驱动程序(或mongodb服务器版本)、xml2js或其他相关

我做了很多测试,并找到了解决问题的方法,但我很想知道问题出在哪里

我有一个应用程序可以执行以下操作:

  • 将XForm(survey.xml)上传到ExpressJS
  • 使用xml2js库将XML转换为JSON对象(示例如下所示)
  • 遍历在2中创建的JSON对象并删除不必要的字段(下面显示的代码片段)
  • 使用MongoDB本机驱动程序将3中修改的JSON对象推送到MongoDB
  • 步骤4因错误而失败(如问题标题所示)

  • 有两个JSON对象,一个是survey表单,包含$keys,但是在将文档插入mongodb之前,我使用以下代码删除了$keys

    (function traverse(o) {
    for (var i in o) {
      if (o[i] !== null && typeof(o[i])=="object") {
          //going on step down in the object tree!!
        if(o[i].$) {
          var ref = "";
          if(o[i].$.ref) {
            ref = o[i].$.ref;
          } else if (o[i].$.nodeset) {
            ref = o[i].$.nodeset;
          }
          o[i].ref = ref;
          o[i].$ = undefined;
          var chunks = ref.split('/');
          o[i]['name'] = chunks[chunks.length - 1];
        }
        traverse(o[i]);
      }
    }
    })(body);
    
  • 在将上面的输出添加到MongoDB之前,我将console.log记录下来,并且console.log没有显示带有$的键的迹象

  • 假设第2步实际上由于键中的$而失败,这是不正确的,我有另一个JSON,它是调查的响应,不包含任何$,但也失败了,并出现相同的错误(MongoError:key$不能以“$”开头)

  • 下面是XML表单提交

       <?xml version='1.0' ?>
       <ppe id="ppe_checklist_new">
        <starting_repeat>
            <location>dark_room</location>
            <ppe_dark>safety_glasses</ppe_dark>
            <xyz_group>
                <condition>condition_missing</condition>
                <test_condition>b</test_condition>
            </xyz_group>
        </starting_repeat>
        <starting_repeat>
            <location>nitrogen_store</location>
            <ppe_nitrogen>leather_gloves_s</ppe_nitrogen>
            <xyz_group>
                <condition>condition_replacing</condition>
                <test_condition />
            </xyz_group>
        </starting_repeat>
        <starting_repeat>
            <location>nitrogen_store</location>
            <ppe_nitrogen>blue_gloves_m</ppe_nitrogen>
            <xyz_group>
                <condition />
                <test_condition>b</test_condition>
            </xyz_group>
        </starting_repeat>
        <starting_repeat>
            <location>cold_room_first</location>
            <ppe_cold>hearing_muff_1</ppe_cold>
            <xyz_group>
                <condition>condition_ok</condition>
                <test_condition>f</test_condition>
            </xyz_group>
        </starting_repeat>
        <sample_group>
            <date>2015-08-24</date>
            <random_number>55</random_number>
        </sample_group>
        <another_group>
            <another_repeat>
                <sample_text>Sample text 1</sample_text>
                <image />
            </another_repeat>
            <another_repeat>
                <sample_text>Sample text 2</sample_text>
                <image />
            </another_repeat>
        </another_group>
        <form_done>OK</form_done>
        <survey_start>2015-08-24T16:55:23.185+01</survey_start>
        <survey_end>2015-08-24T16:57:24.460+01</survey_end>
        <survey_day>2015-08-24</survey_day>
        <survey_device>353490061313389</survey_device>
        <meta>
            <instanceID>uuid:2aba0eff-5350-47e3-9e9c-9606d2c9e7d6</instanceID>
        </meta>
    </ppe>
    
    模块生成一个JSON对象,如下图:

    {
        "ppe": {
            "starting_repeat": [
                {
                    "location": "dark_room",
                    "ppe_dark": "safety_glasses",
                    "xyz_group": {
                        "condition": "condition_missing",
                        "test_condition": "b"
                    }
                },
                {
                    "location": "nitrogen_store",
                    "ppe_nitrogen": "leather_gloves_s",
                    "xyz_group": {
                        "condition": "condition_replacing",
                        "test_condition": ""
                    }
                },
                {
                    "location": "nitrogen_store",
                    "ppe_nitrogen": "blue_gloves_m",
                    "xyz_group": {
                        "condition": "",
                        "test_condition": "b"
                    }
                },
                {
                    "location": "cold_room_first",
                    "ppe_cold": "hearing_muff_1",
                    "xyz_group": {
                        "condition": "condition_ok",
                        "test_condition": "f"
                    }
                }
            ],
            "sample_group": {
                "date": "2015-08-24",
                "random_number": "55"
            },
            "another_group": {
                "another_repeat": [
                    {
                        "sample_text": "Sample text 1",
                        "image": ""
                    },
                    {
                        "sample_text": "Sample text 2",
                        "image": ""
                    }
                ]
            },
            "form_done": "OK",
            "survey_start": "2015-08-24T16:55:23.185+01",
            "survey_end": "2015-08-24T16:57:24.460+01",
            "survey_day": "2015-08-24",
            "survey_device": "353490061313389",
            "id": "ppe_checklist_new",
            "uuid": "2aba0eff-5350-47e3-9e9c-9606d2c9e7d6"
        }
    }
    
    我试着检查插入MongoDB的数据是否为object,结果证明它是object

    typeof(result.result)
    
  • 尝试通过Mongo Shell从xml2js插入生成的JSON对象,结果成功了
  • 尝试在我的javascript代码中创建一个JS对象,该对象的内容与xml2js生成的JSON相同,并通过MongoDB本机驱动程序将其插入MongoDB中,效果良好(尽管我比较了两个JSON,发现它们完全相同) 总之,我可以说mongodb本机驱动程序不喜欢xml2js模块生成的JSON对象,为什么我不知道?我迫不及待想知道。我尝试了以下方法来解决这个问题

  • 使用xml2js转换xml2json
  • Stringify从xml2js返回的JSON对象(x=JSON.Stringify(obj);)
  • 重新解析了字符串化的JSON对象(parsedX=JSON.parse(x);)
  • 通过MongoDB本机驱动器将解析后的值插入MongoDB,它就成功了 无论问题是什么,上面的错误消息都有点误导性,或者可能不适合导致它的这个问题。我找不到一种方法来获得更详细的错误信息(也许有一种方法mongodb可以提供更多的解释,我很想知道)


    感谢您的时间和耐心。

    下面的
    遍历
    函数行只是将
    $
    字段设置为
    未定义
    的值,而没有实际删除它

    o[i].$ = undefined;
    
    将该行更改为使用
    delete
    将其删除:

    delete o[i].$;
    

    使用
    JSON.stringify
    JSON.parse
    的变通方法之所以有效,是因为
    undefined
    值不能用JSON表示,因此
    JSON.stringify
    调用将删除具有该值的字段。

    解析对象的第一行基本上是
    {“ppe”:{“$:{”id:“ppe checklist\u new”,
    这无疑是问题的根源。关键是你能不能不从下一个元素开始工作,即
    “开始重新创建”:[
    ?或者甚至是
    {“ppe”:{“$”:
    ?你也可能真的不想把它作为原始输入到你的数据库中。它是一个“数据库”毕竟,这不是一个XML文件。所以这里还有其他考虑因素。请尝试将
    o[i].$=undefined;
    行更改为
    delete o[i].$;
    ;@johnyhk干杯,删除成功了。我很好奇JSON.stringify()之后是JSON.parse()方法奏效了。考虑到这个问题,这些方法对JSON对象有什么特别的作用吗?是的,
    未定义的
    值不能用JSON表示,因此
    JSON.stringify
    将删除任何具有该值的字段。@BlakesSeven如果我在ppe之后使用,那么我将丢失一些字段(form_done,survey_start,等等)。raw是什么意思?我绝对不会像上面所示将JSON插入数据库,在这种情况下,整数、日期也会以字符串结束。我将修改JSON,以便所有非字符串字段都使用MongoDB数据类型存储。对不起,我指的是MongoDB。谢谢您的评论。
    o[i].$ = undefined;
    
    delete o[i].$;