如何将字符串数组转换为逗号分隔值的字符串在MongoDB 4.0中?

4
我有一个集合,其中包含一个如下的数组字段。
availableProducts: [ "mobile", "laptop", "desktop"]

现在我想将这个字段更新为字符串字段,同时我需要保持数组的值作为逗号分隔的字符串如下所示

availableProducts: "mobile,laptop,desktop"

在MongoDB 4.0版本中,我们能否处理近100万条记录?

3个回答

3

更简单易懂的方式:

db.collection.aggregate([
  {
    $addFields: {
      "availableProducts": {
        $reduce: {
          input: "$availableProducts",
          initialValue: "",
          in:{
            $concat:[
               "$$value",
               {
                  "$cond":{
                     "if":{
                        "$eq":[
                           "$$value",
                           ""
                        ]
                     },
                     "then":"",
                     "else":","
                  }
               },
               "$$this"
            ]
         }
        }
      }
    }
  },
  {$out:'collection'}
])

来源:https://docs.mongodb.com/manual/reference/operator/aggregation/reduce/

reduce操作符在聚合管道中使用,可以将输入文档集合中的所有文档按指定的条件进行分组、排序、筛选等处理,并返回一个或多个结果文档。reduce操作符常用于数据分析、统计和计算等场景中,可以通过自定义JavaScript函数实现各种复杂的聚合运算。


2
你可以通过以下方式在mongo shell中完成此操作:

输入文档:

{ "_id" : 1, "a" : [ "blue", "green", "red" ] }
{ "_id" : 2, "a" : [ "cat", "dog", "rat" ] }

查询:

db.arr1.find()
       .forEach( doc => { doc.a = doc.a.toString(); db.arr1.save(doc); } )

结果(更新后的集合):
{ "_id" : 1, "a" : "blue,green,red" }
{ "_id" : 2, "a" : "cat,dog,rat" }

100万条记录...确定要使用forEach(...save)吗? - matthPen
@matthPen 为什么你有疑虑呢?有什么问题吗?在一台普通的笔记本电脑上,你可以在几分钟内更新100万个文档。 - prasad_
我的解决方案:没有从数据库中获取任何内容,只有一个请求。 你的解决方案:从数据库中获取了1百万个文档,进行了1百万次请求。而且我还没有提到分片或复制。哪一个是最好的? - matthPen

0
你可以通过以下聚合方式实现这一点:
db.collection.aggregate([
  {
    $addFields: {
      "availableProducts": {
        $reduce: {
          input: "$availableProducts",
          initialValue: "",
          in: {
            "$cond": {
              if: {
                "$eq": [
                  {
                    "$indexOfArray": [
                      "$availableProducts",
                      "$$this"
                    ]
                  },
                  0
                ]
              },
              then: {
                "$concat": [
                  "$$value",
                  "$$this"
                ]
              },
              else: {
                "$concat": [
                  "$$value",
                  ",",
                  "$$this"
                ]
              }
            }
          }
        }
      }
    }
  },
  {$out:'collection'}
])

小心使用,因为$out阶段将用结果替换整个集合。我的建议是在没有$out阶段的情况下进行测试。

你可以在这里进行测试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接