我已经使用 mongoimport 在 mongo 中导入了一个 csv 文件,我想从我的字符串值中删除前导和尾随空格。
是否可以直接在 mongo 中对所有集合使用修剪函数,还是我需要为此编写脚本?
我的收藏包含以下元素:
{
"_id" : ObjectId("53857680f7b2eb611e843a32"),
"category" : "Financial & Legal Services "
}
我想对所有集合应用 trim 函数,以便 "category"
不应该包含任何前导和尾随空格。
最佳答案
MongoDB 中的更新目前无法在应用更新时引用当前字段的现有值。所以你将不得不循环:
db.collection.find({},{ "category": 1 }).forEach(function(doc) {
doc.category = doc.category.trim();
db.collection.update(
{ "_id": doc._id },
{ "$set": { "category": doc.category } }
);
})
注意 $set
的使用运营商那里和预计的“类别”字段只是为了减少网络流量”
您可以使用 $regex
限制处理的内容匹配:
db.collection.find({
"$and": [
{ "category": /^\s+/ },
{ "category": /\s+$/ }
]
})
或者更纯$regex
不使用 $and
你只需要在 MongoDB 中将多个条件应用于同一字段。否则$and
对所有参数都是隐含的:
db.collection.find({ "category": /^\s+|\s+$/ })
这将匹配的文档限制为仅处理那些具有前导或尾随空格的文档。
如果您担心要查看的文档数量,如果您有 MongoDB 2.6 或更高版本可用,批量更新应该会有所帮助:
var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1 }).forEach(
function(doc) {
batch.push({
"q": { "_id": doc._id },
"u": { "$set": { "category": doc.catetgory.trim() } }
});
if ( batch.length % 1000 == 0 ) {
db.runCommand("update", batch);
batch = [];
}
}
);
if ( batch.length > 0 )
db.runCommand("update", batch);
或者甚至使用 bulk operations API对于 MongoDB 2.6 及更高版本:
var counter = 0;
var bulk = db.collection.initializeOrderedBulkOp();
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
function(doc) {
bulk.find({ "_id": doc._id }).update({
"$set": { "category": doc.category.trim() }
});
counter = counter + 1;
if ( counter % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
}
);
if ( counter > 1 )
bulk.execute();
最好使用 bulkWrite()
为使用批量操作 API 的现代 API 完成(技术上 一切 现在都做)但实际上在某种程度上这对于旧版本的 MongoDB 来说是安全回归。老实说,这意味着在 MongoDB 2.6 之前,使用这样的版本,您将无法获得官方支持选项。编码更清晰一些:
var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
function(doc) {
batch.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "category": doc.category.trim() } }
}
});
if ( batch.length % 1000 == 0 ) {
db.collection.bulkWrite(batch);
batch = [];
}
}
);
if ( batch.length > 0 ) {
db.collection.bulkWrite(batch);
batch = [];
}
每 1000 个文档只向服务器发送操作一次,或者在 64MB BSON 限制下尽可能多的修改。
作为解决问题的几种方法。或者在导入之前先更新您的 CSV 文件。
关于mongodb - 从字符串值中删除空格(前导和尾随),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23903785/