无法将MongoDB文档字段设置为Null

时间:2019-10-02 08:29:30

标签: javascript mongodb

我试图通过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

0 个答案:

没有答案