node / mongodb:如何将字段向上移动一级

时间:2014-07-24 11:31:09

标签: node.js mongodb

我有几百万份文件的集合,格式为:

{
   _id: ...
   main: {
     case: ...
     csc: ...
   }
}

并需要将其转换为:

{
  _id: ...
  case: ...
  csc: ...
}

我在stackoverflow找到了答案,但他们使用mongo shell(同步)。我想在使用mongodb驱动程序的节点中做同样的事情。

我已经尝试cursor.each循环遍历文档,但是insert命令需要回调,所以我坚持使用该解决方案:

coll.find().each(function(err, item) {
  newDoc.insert(item.main, function(err) {
    ???
  })
});

我也试过update

update({}, {$set: {case: value.case, csc: value.csc}, function(err) {
   ...
});

哪个不起作用(因为你不能在$ set参数中使用value.casevalue.csc?)

我有一个使用findtoArray的解决方案,循环遍历一个级别的nodejs中的文档,并将新文档插入新的集合中:

coll.find().toArray(function(err, documents) {
  for (var doc in documents) {
    newDocs.push(documents[doc].main);
  }
  newColl.insert(newDocs, function(err) {
    ...
  });
});

我对更有效/更优雅的解决方案感兴趣。

1 个答案:

答案 0 :(得分:3)

如果我明白,试试这个。

db.coll.aggregate([
{
    $group:{
        _id:"$_id",
        case :{$first:"$main.case"},
        csc :{$first:"$main.csc"},
        }
},{
    $out:"new_collection"
}

])

之后你会有一个名为" new_collection"的新集合。用这种格式

{
    "_id" : 3,
    "case" : 4,
    "csc" : 5
}

{
    "_id" : 2,
    "case" : 3,
    "csc" : 4
}

<强>更新 你可以尝试

db.new_collection.update({},{$rename:{'main.case':'case','main.csc':'csc'}},{multi:true})
//now is Empty
db.new_collection.update({},{$unset:{'main':1}},{multi:true})

如果我理解:)