我试图通过mongo shell修改集合以修剪所有字符串,然后,如果该字段是字符串但是数字,则将其数据类型更改为数字。
这是我正在使用的代码:
function isNumeric(num) {
return !isNaN(parseFloat(num)) && isFinite(num);
}
var bulk = db.yale.initializeOrderedBulkOp();
var counter = 0;
db.yale.find().forEach((doc) => {
let updoc = {
"$set" : {}
};
// get document fields but ignore immutable id field
let fields = Object.keys(doc);
let badField = fields.indexOf("_id");
if (badField > -1) {
fields.splice(badField, 1);
}
fields.forEach((field) => {
if (typeof doc[field] === "string") {
updoc["$set"][field] = doc[field].trim();
}
});
fields.forEach((field) => {
if (typeof doc[field] === "string") {
if (isNumeric(doc[field])) {
updoc["$set"][field] = parseFloat(doc[field]);
} else {
if (doc[field].length === 0) {
updoc["$set"][field] = null;
}
}
}
});
bulk.find({
"_id" : doc._id
}).update(updoc);
counter++;
if (counter % 1000 === 0) {
bulk.execute();
bulk = db.yale.initializeOrderedBulkOp();
}
});
(注1:数据集是Vizier服务的Yale Bright Star目录,因此为名称)。
(注2:我更喜欢isNumeric()
函数,而不是!isNan()
,因为老实说,我认为它看起来更好,个人喜好)
在运行代码之前,db.yale.find()
的前两个结果如下:
{ "_id" : ObjectId("5d945e8baea250effd9dd0dc"), "HR" : " 1", "Name" : " ", "HD" : " 3", "SAO" : " 36042", "ADS" : " 46", "VarID" : " ", "RAJ2000" : "00 05 09.9", "DEJ2000" : "+45 13 45", "Vmag" : " 6.70", "BV" : " 0.07", "SpType" : " A1Vn ", "NoteFlag" : "" }
{ "_id" : ObjectId("5d945e8baea250effd9dd0dd"), "HR" : " 11", "Name" : " ", "HD" : " 315", "SAO" : 128595, "ADS" : " ", "VarID" : "Var? ", "RAJ2000" : "00 07 44.1", "DEJ2000" : "-02 32 56", "Vmag" : " 6.43", "BV" : -0.14, "SpType" : " B8IIIpSi ", "NoteFlag" : "*" }
运行后,第一行如下:
{ "_id" : ObjectId("5d945e8baea250effd9dd0dc"), "HR" : 1, "Name" : "", "HD" : 3, "SAO" : 36042, "ADS" : 46, "VarID" : "", "RAJ2000" : "00 05 09.9", "DEJ2000" : "+45 13 45", "Vmag" : 6.7, "BV" : 0.07, "SpType" : "A1Vn", "NoteFlag" : null }
{ "_id" : ObjectId("5d945e8baea250effd9dd0dd"), "HR" : 11, "Name" : "", "HD" : 315, "SAO" : 128595, "ADS" : "", "VarID" : "Var?", "RAJ2000" : "00 07 44.1", "DEJ2000" : "-02 32 56", "Vmag" : 6.43, "BV" : -0.14, "SpType" : "B8IIIpSi", "NoteFlag" : "*" }
请注意,在第一个文档中,“ ADS”字段已转换为数字,但是在第二个文档中,“ ADS”字段仍为空字符串,尽管应将其转换为null。 / p>
我不想从集合中完全删除该字段。对于将要使用它的服务而言,null值表示某些含义。
谁能看到javascript导致字段不转换为null的问题?这可能只是我忽略的愚蠢错误。
Jason