我正在从Amazon API检索有关图书的数据并将其存储为JSON对象。然后我想将这些数据插入到Meteor集合中。但是,JSON数据中的某些字段以" $"开头。字符,导致此错误:
MongoError:美元($)前缀字段' $' in' result.results.0.ItemAttributes.0.ManufacturerMaximumAge.0。$'对存储无效。
我想帮助将数据插入到集合中,因为数据包含" $"迹象。如果那是不可能的,有没有办法删除所有出现的" $"在JSON数据中然后将它存储到Meteor集合中? 这是我的代码,给定书名和作者,搜索Amazon API并返回有关前10个结果的信息:( SearchResult是对集合的引用)
Meteor.methods({
itemSearch(appUUID,title, author) {
var result = {};
result.search = {
appUUID: appUUID,
title: title,
author: author
}
client.itemSearch({
title: title,
author: author,
searchIndex: 'Books',
responseGroup: 'ItemAttributes, Images'
}).then(function(results){
result.results = results;
var upsertResult = SearchResult.upsert( {
appUUID: appUUID,
title: title,
author: author,
},
{
$set: {result: result}
}
);
}).catch(function(err){
SearchResult.upsert({
appUUID: appUUID,
title: title,
author: author,
},
{
$set: {result: result }
}
);
});
}
});
这是JSON数据,以及"单位"之前的美元符号是造成这个问题的原因。
"Width": [
{
"_": "810",
"$": {
"Units": "hundredths-inches"
}
}
]
答案 0 :(得分:1)
简单的答案是,不,你不能在MongoDB的字段中使用$
(来自the docs):
字段名称不能以美元符号($)字符开头。
有许多可能的解决方案可以将您的数据更改为MongoDB可以接受的格式,但为了给您提供我能想到的最简单的解决方案,您只需映射对象的键即可。例如,使用lodash's mapKeys
function:
data = _.mapKeys(data, (value, key) => {
if(key === '$') {
return 'some_custom_key'
} else {
return key
}
})
这会将您的所有$
更改为some_custom_key
。只要你有一个钩子(例如Mongoose的save
中间件和read
中间件docs})可以在引擎盖下为你转换它,它应该是是一个有点可行的解决方案。
我不知道是否可能,但更好的解决方案是让Amazon API在没有$
的情况下为您提供数据,但我无法推测这一点因为我不熟悉那个API。