【问题标题】:mongo-db: Convert string to arraymongo-db:将字符串转换为数组
【发布时间】:2017-01-10 17:30:12
【问题描述】:

我有一个mongodb collection,大约有 4-5 百万个documents。它有一个名称为"role": "admin" 的字段。我想要做的是将所有角色转换为数组,即"role": ["admin"]

我更喜欢not to use forEach 循环。请帮我解决一下这个。我对 mongodb 有点陌生。

old documents

{
  "role": "admin"
}
{
  "role": "mod"
}

new documents

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

【问题讨论】:

  • 是的,之前看到了那个帖子,但不想使用 db.eval 因为它会锁定数据库,直到它自己完成
  • 我认为不使用 forEach 就无法做到这一点。为什么你不喜欢使用 forEach ?

标签: node.js mongodb


【解决方案1】:

你可以使用这样的聚合来做到这一点(直接来自 shell):

db.collection.aggregate([
  {$group: {
     _id: "$_id",
     role: {$push: "$role"}
    }
  },
   {$out: "newCollection"}
])

$group 阶段将产生这些结果:

{ "_id" : ObjectId("5874a728cf097894d781d7f0"), "role" : [ "mod" ] }
{ "_id" : ObjectId("5874a724cf097894d781d7ef"), "role" : [ "admin" ] }

$out 会将其写入特定的集合(可以是新集合或您现有的集合)。

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

【讨论】:

  • 是的,你的方式是我想要的方式,但我还有很多额外的领域以及角色,它不适合那个。可以帮忙修改一下吗?
  • @iamsaksham 当然,如果你想保留其他字段,只需将它们添加到 $group 阶段,如下所示:"fieldname": { $first: "$fieldname"}
猜你喜欢
  • 2016-12-27
  • 2017-11-27
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
相关资源
最近更新 更多