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或其他相关
我做了很多测试,并找到了解决问题的方法,但我很想知道问题出在哪里
我有一个应用程序可以执行以下操作:
(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);
<?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)
感谢您的时间和耐心。下面的
遍历
函数行只是将$
字段设置为未定义
的值,而没有实际删除它
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].$;