2015-08-25 15 views
3

每个人产生的店JSON对象“$”,

MongoDB db.version() is 3.0.5 
mongodb package.json shows 2.0.42 version 
xml2js package.json shows 0.4.9 version 

启动,并通过所有存在的问题看,没有似乎匹配我的情况(既不是jira issue,也不是g oogle group discussions等)。这可能与mongodb本地驱动程序(或MongoDB服务器版本),xml2js或其他东西有关。

我做了很多测试,并找到了解决问题的方法,但是,我很想知道问题所在。

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

  1. 上传的XForm(survey.xml)到ExpressJS
  2. 使用xml2js库XML以JSON对象转换(如下图所示样品)
  3. 迭代通过JSON对象2中创建和删除不必要的字段
  4. 按下改性JSON对象在3至的MongoDB使用mongodb的本机驱动程序(如下所示代码段)

步骤4失败,出现错误(显示在问题的标题中)。

  1. 有2个JSON对象,一个是调查表格,包含$密钥,但,在我插入将文档分成mongodb的,我使用以下代码

    (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); 
    
  2. 予删除$键控制台在将其添加到MongoDB之前记录以上输出,并且console.log显示没有带$的键的符号。

  3. 假设第2步实际上由于键中的$而失败,这不是真的,我还有另一个JSON,它是调查的响应并且不包含任何$,但是也失败了同样的错误( MongoError:key $不能以'$'开头)。

    db.collection('submissions').insert(jsonObject, function(err, result) { 
        if(err) console.log('error is : ' + err); 
        console.log('insertion result : ' + JSON.stringify(result)); 
    }); 
    

下面是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> 

我喂到xml2js模块与以下CONFIGS以上:

function parseXMLToJS(filename, path, callback) { 
    var parser = new xml2js.Parser({explicitArray:false}); 
    var fileURL = path + filename; 

    var data = fs.readFile(fileURL, function(err, data) { 
    if(err) { 
     logger.error('Error reading submission file. Error %', err); 
    } else { 
     parser.parseString(data, function (err, result) { 
     if(err) { 
      logger.error('Error parsing XML to JS. Error : %', err); 
      callback({parsed:false, result:result}); 
     } else { 
      callback({parsed:true, result:result}); 
     } 
     }); 
    } 
    }); 
} 

和模块产生一个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的数据是否是对象,事实证明它是。

typeof(result.result) 
  1. 试图插入来自xml2js经由蒙戈壳牌所生成的JSON对象和它的工作。
  2. 试图在我的JavaScript代码中创建一个JS对象,其内容与xml2js生成的JSON相同,并通过mongodb本地驱动程序将其插入到MongoDB中(即使我比较了两个JSON,它们完全相同)。

总之,我可以说mongodb本地驱动程序不喜欢由xml2js模块生成的JSON对象,为什么我不知道?我迫不及待想知道。我尝试了以下解决

  1. 使用xml2js
  2. 字符串化从xml2js返回的JSON对象转换的XML 2 JSON(X = JSON.stringify(OBJ);)
  3. 解析的字符串化JSON对象返回(parsedX = JSON.parse(x);)
  4. 通过mongodb本地驱动器将解析的值插入到MongoDB中,并且它工作正常。

无论出现什么问题,上述错误消息都有点误导或可能不适合导致它的这个问题。我找不到一种方法来获得更详细的错误(也许有一种方式,mongodb提供更多的解释,很想知道)。

谢谢你的时间和耐心。

+0

那么解析对象中的第一行基本上是'{“ppe”:{“$”:{“id”:“ppe_checklist_new”},'这无疑是问题的根源。问题是,你是不是可以从下一个“starts_repreat”元素开始工作:['?或者甚至只是在'{“ppe”:{“$”:'?你也可能真的不希望这是原始数据输入。它毕竟是一个“数据库”,而不是一个XML文件。所以这里还有其他的考虑。 –

+2

尝试将'o [i]。$ = undefined;'行更改为'delete o [i]。$;'; – JohnnyHK

+0

@JohnnyHK欢呼,删除了伎俩。我很好奇JSON.stringify()后面跟着JSON.parse()方法。考虑到这个问题,这些方法是否对JSON对象有任何幻想? – Raf

回答

2

traverse函数的以下行只是将$字段设置为值undefined而不实际删除它。

o[i].$ = undefined; 

更改该行使用delete,而不是将其删除:

delete o[i].$; 

使用JSON.stringifyJSON.parse作品,因为undefined价值不能在JSON所以JSON.stringify调用删除领域与代表你的解决方法那个价值。

相关问题