Node.js mongo db:将字符串转换为数组

Node.js mongo db:将字符串转换为数组,node.js,mongodb,Node.js,Mongodb,我有一个mongodb集合,大约有400-500万文档。它有一个名为“角色”的字段:“管理员”。我要做的是将所有角色转换为数组,即“role”:[“admin”] 我宁愿不使用forEach循环。请帮我做这个。我对mongodb有点陌生 旧文档 { "role": "admin" } { "role": "mod" } { "role": ["admin"] } { "role": ["mod"] } 到新文档 { "role": "admin" } { "role"

我有一个
mongodb集合
,大约有400-500万
文档
。它有一个名为“角色”的字段:“管理员”。我要做的是将所有角色转换为数组,即
“role”:[“admin”]

我宁愿
不使用forEach
循环。请帮我做这个。我对mongodb有点陌生

旧文档

{
  "role": "admin"
}
{
  "role": "mod"
}
{
  "role": ["admin"]
}
{
  "role": ["mod"]
}
新文档

{
  "role": "admin"
}
{
  "role": "mod"
}
{
  "role": ["admin"]
}
{
  "role": ["mod"]
}

您可以这样使用聚合(直接从shell)来完成此操作:

$group阶段将产生以下结果:

{ "_id" : ObjectId("5874a728cf097894d781d7f0"), "role" : [ "mod" ] }
{ "_id" : ObjectId("5874a724cf097894d781d7ef"), "role" : [ "admin" ] }
$out会将其写入特定集合(可以是新集合,也可以是现有集合)


使用$out覆盖现有集合时要小心,因为您无法撤消该操作

您可以使用如下聚合(直接从shell)来完成此操作:

$group阶段将产生以下结果:

{ "_id" : ObjectId("5874a728cf097894d781d7f0"), "role" : [ "mod" ] }
{ "_id" : ObjectId("5874a724cf097894d781d7ef"), "role" : [ "admin" ] }
$out会将其写入特定集合(可以是新集合,也可以是现有集合)


使用$out覆盖现有集合时要小心,因为您无法撤消该操作

请参阅此链接->耶,之前看到过该帖子,但不想使用db.eval,因为它将锁定数据库直到完成它自己的操作。我认为如果不使用forEach,我们无法做到这一点。为什么你不喜欢使用forEach?请参考此链接->耶,之前看到过那篇文章,但不想使用db.eval,因为它会锁定数据库,直到完成它自己。我认为如果不使用forEach,我们无法做到这一点。为什么你不喜欢使用forEach?是的,你的方式是我想要的方式,但我还有很多额外的领域以及角色,它不适用于这一点。你能帮我修改一下吗?@iamsaksham当然,如果你想保留其他字段,只需在$group阶段这样添加它们:“fieldname”:{$first:$fieldname}是的,你的方式是我想要的方式,但我还有许多其他字段以及角色,这不适用。你能帮我修改一下吗?@iamsaksham当然,如果你想保留其他字段,只需像这样将它们添加到$group阶段:“fieldname”:{$first:$fieldname}