Javascript Can';t将MongoDB文档字段设置为空
我试图通过mongo shell修改集合以修剪所有字符串,然后,如果字段是字符串但为数字,则将其数据类型更改为数字 以下是我正在使用的代码: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
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映像运行的。