我有几百万份文件的集合,格式为:
{
_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.case
和value.csc
?)
我有一个使用find
和toArray
的解决方案,循环遍历一个级别的nodejs中的文档,并将新文档插入新的集合中:
coll.find().toArray(function(err, documents) {
for (var doc in documents) {
newDocs.push(documents[doc].main);
}
newColl.insert(newDocs, function(err) {
...
});
});
我对更有效/更优雅的解决方案感兴趣。
答案 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})
如果我理解:)