每个人产生的店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或其他东西有关。
我做了很多测试,并找到了解决问题的方法,但是,我很想知道问题所在。
我有一个应用程序,执行以下操作:
- 上传的XForm(survey.xml)到ExpressJS
- 使用xml2js库XML以JSON对象转换(如下图所示样品)
- 迭代通过JSON对象2中创建和删除不必要的字段
- 按下改性JSON对象在3至的MongoDB使用mongodb的本机驱动程序(如下所示代码段)
步骤4失败,出现错误(显示在问题的标题中)。
有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);
予删除$键控制台在将其添加到MongoDB之前记录以上输出,并且console.log显示没有带$的键的符号。
假设第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)
- 试图插入来自xml2js经由蒙戈壳牌所生成的JSON对象和它的工作。
- 试图在我的JavaScript代码中创建一个JS对象,其内容与xml2js生成的JSON相同,并通过mongodb本地驱动程序将其插入到MongoDB中(即使我比较了两个JSON,它们完全相同)。
总之,我可以说mongodb本地驱动程序不喜欢由xml2js模块生成的JSON对象,为什么我不知道?我迫不及待想知道。我尝试了以下解决
- 使用xml2js
- 字符串化从xml2js返回的JSON对象转换的XML 2 JSON(X = JSON.stringify(OBJ);)
- 解析的字符串化JSON对象返回(parsedX = JSON.parse(x);)
- 通过mongodb本地驱动器将解析的值插入到MongoDB中,并且它工作正常。
无论出现什么问题,上述错误消息都有点误导或可能不适合导致它的这个问题。我找不到一种方法来获得更详细的错误(也许有一种方式,mongodb提供更多的解释,很想知道)。
谢谢你的时间和耐心。
那么解析对象中的第一行基本上是'{“ppe”:{“$”:{“id”:“ppe_checklist_new”},'这无疑是问题的根源。问题是,你是不是可以从下一个“starts_repreat”元素开始工作:['?或者甚至只是在'{“ppe”:{“$”:'?你也可能真的不希望这是原始数据输入。它毕竟是一个“数据库”,而不是一个XML文件。所以这里还有其他的考虑。 –
尝试将'o [i]。$ = undefined;'行更改为'delete o [i]。$;'; – JohnnyHK
@JohnnyHK欢呼,删除了伎俩。我很好奇JSON.stringify()后面跟着JSON.parse()方法。考虑到这个问题,这些方法是否对JSON对象有任何幻想? – Raf