mongodb - 从字符串值中删除空格(前导和尾随)

标签 mongodb mongodb-query trim

我已经使用 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/

相关文章:

spring - 如何使用 Spring Mongo 对两个字段进行分组并根据另一个字段获取一个字段的数组?

MongoDB获取子文档

在 n 个字符后 trim 的 JavaScript

mongodb - 如何使用 Spark 的 Mongo-Hadoop 连接器删除文档(记录)

java - 解析 AggregationOutput mongo java 驱动程序

java - 如何查找符合多个条件的文档

iphone - 为什么Xcode在字符串末尾添加空格?

c - 从 C 中的字符串中去除空格和换行符

MongoDB 没有记录到日志文件

node.js - 使用 Node.js 和 MongoDB 的警报系统