首页 > 解决方案 > 使用 $regex 从 MongoDB 中的集合数组中删除所有 base64 匹配项

问题描述

我有一个包含 base64 图像数组和普通文件名的图像对象的集合。我需要删除所有 base64 元素并只保留文件名。

 images: {
      more:[
       'data:image/jpeg;base64,/9j/4Q...',
       'data:image/jpeg;base64,/9j/4Q...',
       'data:image/jpeg;base64,/9j/4Q...',
       'file1.png', 
       'file2.png'
      ]
  }

我使用了这些查询,但我无法更新数组:

  db.cars.updateMany({}, {$pull: {'images.more': {$regex: '/^data(.+)$/'}}})

  db.cars.updateMany({}, {$pull: {'images.more': {$regex: '/^data:([A-Za-z-+\/]+);base64,(.+)$/'}}})

两个查询都返回:

{ "acknowledged" : true, "matchedCount" : 163, "modifiedCount" : 0 }

在示例对象中,我使用 image/jpeg,但它也可能包含 bmp 图像或 png,因此正则表达式必须匹配所有可能的图像类型。

标签: mongodbmongoose

解决方案


不要在字符串值中包含/分隔符:$regex

db.cars.updateMany({}, {$pull: {'images.more': {$regex: '^data(.+)$'}}})

/分隔符仅用于 JS 正则表达式语法(也适用):

db.cars.updateMany({}, {$pull: {'images.more': {$regex: /^data(.+)$/}}})

推荐阅读