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

4

我有一个mongodb集合中的字符串字段,其中包含逗号分隔的值。现在我想将该特定字段的类型更改为数组。由于该集合包含3000万条记录,下面的查询是否会对性能产生影响?

    db.getCollection("collectionName").find().forEach( function (el) {
         el.NameofFieldToChangeType = el.NameofFieldToChangeType.split(',');
         db.databaseName.save(el);
    });
2个回答

6

考虑到数据量,我肯定会直接在服务器上运行。以下是一个可用作指南的示例。它将使用$split生成一个新的数组来替换names字段。

db.collectionName.aggregate(
    [
        { "$addFields": { 
            "names": { "$split": [ "$names", "," ] } 
        }},
        {$out:"collectionName"}
    ]
)

@matthPen 在发布示例之前,该代码已经针对 v 4.0.4 进行了测试和验证。不确定您为什么认为它无法工作。 - Samuel Goldenbaum
1
db.databaseName.save(el); => 从未与您的聚合一起使用。您只是在查询响应上转换数据,但从未将这些数据持久化到数据库中。 - matthPen
1
但是你对于转换本身以及数据量的观点是正确的。 - matthPen
你的意思是在聚合查询之后,数据会更新到你的数据库中吗?换句话说,如果你执行了聚合操作,那么在执行find()操作时,“names”字段将返回数组而不是字符串?很好奇在没有$out阶段的情况下是否能实现这一点... - matthPen
@@matthPen,抱歉,你是正确的,我一定是匆忙查看了输出结果。感谢你指出来。 - Samuel Goldenbaum
1
没问题,每个人至少都遇到过这种错误。 :) - matthPen

2
在4.2版本之前,您需要使用聚合和$out阶段来实现您所需的功能。
db.collectionName.aggregate(
    [
        { "$addFields": { 
            "NameofFieldToChangeType": { "$split": [ "$NameofFieldToChangeType", "," ] } 
        }},
        {$out:"collectionName"}
    ]
)

从4.2版本开始,您可以在更新参数中使用聚合(updateMany with aggregation),如下所示:
db.collectionName.updateMany(
  {},
  [{$addFields:{"NameofFieldToChangeType": { "$split": [ "$NameofFieldToChangeType", "," ]}}
  }]
)

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