Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';t将MongoDB文档字段设置为空_Javascript_Mongodb - Fatal编程技术网

Javascript Can';t将MongoDB文档字段设置为空

Javascript Can';t将MongoDB文档字段设置为空,javascript,mongodb,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((do

我试图通过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服务提供的耶鲁亮星目录,因此得名)。 (注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" : "*" }
运行后,第一行如下所示:

{ "_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

我不想从集合中完全删除该字段。为了将要使用它的服务,null的值意味着一些东西

任何人都能看到导致字段不转换为null的javascript问题吗?这可能只是我忽略的一个愚蠢的错误


Jason

你能试着传递
未定义的
而不是
空的
吗?这行吗?“…ADS”字段仍然是一个空字符串,虽然它应该被转换为空。”--嗯,不。请再次阅读您的代码。是的,您确实执行了
updoc[“$set”][field]=doc[field].trim()但实际上您从未执行过
doc[field]=doc[field].trim()
。这当然是您的逻辑的其他部分实际期望您做的,因为
doc[field].length==0
当然不是零,因为您从未实际更改过该变量,只更改了数据库中的值。与MongoDB完全无关。您只是没有错误地实现逻辑。另外,直接使用
bulk
API方法也不是很好的实践。您确实应该使用
bulkWrite()
。事实上,如果您实际连接到不支持批量操作的MongoDB,该方法确实会优雅地降级。在这个时代,您不应该连接到如此古老的MongoDB,对于“单次”转换操作来说,这也不是那么重要。但是你也应该知道更好的做法。无用的编辑。“…未正确执行逻辑”。没有错误,因为我设法在5分钟的评论编辑窗口出现之前进行了编辑。看看现在正确地回顾事情有多重要这个pot@Neil是的,我怀疑我做了什么蠢事。我还将考虑一次性对文档进行所有更改,并使用``Bulk.replaceOne()``减少总操作数。数据库版本不是问题,Mongo是从最近的Docker映像运行的。