как заменить несколько вхождений фразы mongodb - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь заменить несколько вхождений одной и той же фразы в одном и том же поле.

Вот пример содержимого поля 'imageUrl':

"imageUrl": "https://cdn.test.com/s/files/1/0035/4671/0061/products/Screen_Shot_2019-12-13_at_12.47.01_pm_2000x.png?v=1576212956 \ n \ n https://cdn.test.com/s/files/1/0035/4671/0061/products/Screen_Shot_2019-12-13_at_12.47.01_pm_2000x.png?v=1576212956 \ n \ n \ n"

Моя текущая формула:

  {
      $match: {
           imageUrl: { $regex: "_2000x" },
           brand: "Goat The Label"
      }
  },
  { 
      $addFields: { 
          imageUrl: { $split: [ "$imageUrl", "_2000x" ] } 
      } 
  },
  { 
      $addFields: { 
          imageUrl: { 
              $concat: [ 
                        { $arrayElemAt: [ "$imageUrl", 0 ] }, 
                        "_850x", 
                        { $arrayElemAt: [ "$imageUrl", 1 ] }
              ] 
          }
      }
 }]).forEach( doc => db.product.updateOne( { _id: doc._id }, { $set: { imageUrl: doc.imageUrl } } ) )

Преобразует следующее в:

"imageUrl": "https://cdn.test.com/s/files/1/0035/4671/0061/products/Screen_Shot_2019-12-13_at_12.47.01_pm_850x.png?v=1576212956 \ n \ n \ n" `` `

Однако , я ищу вывод:

"imageUrl": "https://cdn.test.com/s/files/1/0035/4671/0061/products/Screen_Shot_2019-12-13_at_12.47.01_pm_850x.png?v=1576212956 \ n \ n https://cdn.test.com/s/files/1/0035/4671/0061/products/Screen_Shot_2019-12-13_at_12.47.01_pm_850x.png?v=1576212956 \ n \ n \ n "

Оба URL-адреса все еще присутствуют и адаптированы к измерению _850x.

Примечание: Ввод поля может быть более одного URL (может содержать 2-7).

Заранее благодарен за любую помощь

1 Ответ

3 голосов
/ 25 февраля 2020

$ уменьшить подходит лучше для вашего случая использования:

Псевдокод

value = url.split("_2000x")[0]
for (item: url.split("_2000x")[1:])
    value += "_850x" + item

db.collection.aggregate([
  {
    $match: {
      imageUrl: {
        $regex: "_2000x"
      },
      brand: "Goat The Label"
    }
  },
  {
    $addFields: {
      imageUrl: {
        $reduce: {
          input: {
            $slice: [
              {
                $split: [
                  "$imageUrl",
                  "_2000x"
                ]
              },
              1,
              {
                $size: {
                  $split: [
                    "$imageUrl",
                    "_2000x"
                  ]
                }
              }
            ]
          },
          initialValue: {
            $arrayElemAt: [
              {
                $split: [
                  "$imageUrl",
                  "_2000x"
                ]
              },
              0
            ]
          },
          in: {
            $concat: [
              "$$value",
              "_850x",
              "$$this"
            ]
          }
        }
      }
    }
  }
])

MongoPlayground

РЕДАКТИРОВАТЬ: Для выполнения через Bash shell:

Windows:

создать темп. js файл с:

db.collection.aggregate(...).forEach(...)

создать файл temp.bat с:

@echo off

path/to/mongo.exe --uri put_here_mongodb+srv temp.js

Теперь запустите: temp.bat

Unix:

создать файл temp. js с:

db.collection.aggregate(...).forEach(...)

создать файл temp.bat с:

#!/bin/bash

path/to/mongo --uri put_here_mongodb+srv temp.js

Give разрешения на выполнение: chmod u+x temp.sh Теперь запустите: ./temp.sh

...