我从excelsheet
获取数据并使用Node.js中的JSON
将其转换为xlsx-to-json
格式
默认情况下,JSON数据的所有值都以string
格式显示,如:
var jsonObj = [
{
id: '101', // string
email: 'user1@test.com', //string
name: 'user1',
dob: '1990-10-10',
phone: '1234567890', //string
country: 'England',
address: 'Building 201-A, Abc, Xyz'
},
{
id: '102',
email: 'user2@test.com',
name: 'user2',
dob: '1990-10-11',
phone: '1234567890',
country: 'Australia',
address: 'Building 201-A, Abc, Xyz'
},
{
id: '103',
email: 'user3@test.com',
name: 'user3',
dob: '1990-10-12',
phone: '1234567890',
country: 'France',
address: 'Building 201-A, Abc, Xyz'
}
];
当我将此json
插入mongodb时,所有值都以string
数据类型存储。
我想要做的是验证所有这个架构并在将其插入mongodb之前更改其数据类型。
示例:id&电话= number
或integer
,电子邮件,姓名= string
,dob = DATE
,地址= TEXT
和国家= ENUM
最终输出应该是:
var jsonObjResult = [
{
id: 101, //integer
email: 'user1@test.com', //string
name: 'user1', //string
dob: '1990-10-10', //Date
phone: '1234567890', //number
country: ['England', 'Australia', 'France'], // enum
address: 'Building 201-A, Abc, Xyz' // text
},
{
id: '102', // integer
email: 'user2@test.com', //string
name: 'user2', // string
dob: '1990-10-11', //date
phone: '1234567890', // number
country: ['England', 'Australia', 'France'], // enum
address: 'Building 201-A, Abc, Xyz' // text
},
{
id: '103', //integer
email: 'user3@test.com', //string
name: 'user3', // string
dob: '1990-10-12', //date
phone: '1234567890', //number
country: ['England', 'Australia', 'France'], // enum
address: 'Building 201-A, Abc, Xyz' // text
}
];
任何帮助都将不胜感激。
答案 0 :(得分:1)
如果要在MongoDB中拥有有效数据,则必须使用Conform(Revalidator的分支 - https://www.npmjs.com/package/conform)验证输入。选项' castSource'它将转换源对象的值,然后您将在数据库中插入具有正确类型的数据。
var Conform = require('conform');
var myData = {
intField: '123'
};
// after validate intField will be casted to integer
var validateResult = Conform.validate(
myData,
{
properties: {
intField: {
type: 'integer'
}
}
},
{
cast: true,
castSource: true
});
if (validateResult.valid) {
// insert myData to db
}
答案 1 :(得分:0)
我已经创建了一个如何操作的小例子,你必须自己添加缺少的解析器。
首先创建一个解析器,这只是一个为每个需要转换的对象键提供函数的对象。
var parsers = {
id: parseInt,
dob: function(str) {
return new Date(str);
},
phone: parseInt
};
// This will parse the object and apply the transform parsers from above, calls the callback when finished
var parseObject = function(obj, callback) {
var counter = 0;
Object.keys(obj).forEach(function(key, index, array) {
if (parsers.hasOwnProperty(key) /* && typeof parsers[key] === 'function' */) { // typeof check is not really needed, when he trust that we only define functions in our parser above
obj[key] = parsers[key](obj[key]);
}
if (++counter === array.length) {
callback && callback(); // call the callback when all parsers have run
}
});
};
var parseJson = function(json, callback) {
var counter = 0;
for (var i = 0; i < json.length; i++) {
parseObject(json[i], function() { // parses all the objects
if (++counter === json.length) {
callback && callback(); // call the callback when all objects have been parsed
}
});
}
};
parseJson(jsonObj, function() {
console.log(jsonObj); // outputs the parsed object when everything is done.
});