【问题标题】:MongoDB regex replaceMongoDB正则表达式替换
【发布时间】:2016-03-02 07:33:48
【问题描述】:

我的表名是:table_video 我在 db 中的字段名称是:url_value

谁的值是:http://192.168.1.124/test/abcd/abcd.m3u8

我需要的值:http://192.168.1.124/test/abcd_NEW/abcd_NEW.m3u8

“abcd”的位置有多个值,上面的url只是一个例子。

var cursor = db.table_video.find();
while (cursor.hasNext()) {
  var x = cursor.next();
  print("\n\n-----------------------------------");

  print("Before : url_value : "+x['url_value']);

  x['url_value'] = x['url_value'].replace(/^(.*?)\/test\/(.*?)\/(.*?)\.m3u8$/g, $1/test/$2_NEW/$2_NEW.m3u8);

  print("After : url_value : "+x['url_value']);

  db.table_video.update({_id : x._id}, x);

}

当我在 mongo 控制台中执行上述命令时,它给出了一个错误:2015-11-28T12:40:08.342+0530 ReferenceError: $1 is not defined

非常感谢任何帮助

【问题讨论】:

  • 我的正则表达式已经在 Kate 中工作了,即使我检查了你提供的链接,但是它在 mongodb 中给出了错误
  • @user2767817 你的正则表达式错误,它在 Mongo 中不起作用。使用宇智波提供的那个。
  • 宇智波提供的正则表达式是对的,但是,当我在mongodb中使用时,它会报错:2015-11-28T12:40:08.342+0530 ReferenceError: $1 is not defined
  • edit您的问题包含新代码

标签: javascript regex mongodb replace mongodb-query


【解决方案1】:

您的正则表达式错误,您可以使用此regex1 获得预期结果。

但最好的方法是使用"bulk" 操作以获得最大效率。

var bulk = db.table_video.initializeUnorderedBulkOp();
var count = 0;
db.table_video.find().forEach(function(doc) {
    var newUrlValue = doc.url_value.replace(/^(.*?)\/test\/(.*?)\/(.*?)\.m3u8$/, '$1/test/$2_NEW/$3_NEW.m3u8');
    bulk.find( { '_id': doc._id } ).updateOne( { 
        '$set': { 'url_value': newUrlValue } 
    });
    count++;
    if (count % 100 === 0) {
        // Execute per 100 operation and re-init
        bulk.execute();
        bulk = db.table_video.initializeUnorderedBulkOp();
        count = 0;
    }
})

// Clean up queues
if (count > 0)  bulk.execute();

如果您的 MongoDB 版本比 2.6 旧,您需要使用 while 循环。

var cursor = db.table_video.find();
while (cursor.hasNext()) {
    var x = cursor.next();
    print("\n\n-----------------------------------");
    print("Before : url_value : "+x['url_value']);
    var newUrlValue = x['url_value'].replace(/^(.*?)\/test\/(.*?)\/(.*?)\.m3u8$/, '$1/test/$2_NEW/$2_NEW.m3u8');
    print("After : url_value : "+newUrlValue);
    db.table_video.update({ _id : x._id }, { '$set': { 'url_value': newUrlValue } } );

}

  1. @Uchiha 提供的正则表达式。

【讨论】:

  • 嗨@zypA13510,感谢您指出这一点。随意编辑答案。我会批准的。将您的评论用作编辑摘要。
  • @zypA13510 我改写了决定
【解决方案2】:

在 mongodb 4.2 版中,您有 regexFind project operator 可用于获取匹配项,然后您可以使用 substr 替换部分模式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多