如何使用nodejs加速mongoDB(mongoose)批量插入?

时间:2013-11-10 06:33:55

标签: node.js mongodb mongoose

我在集合中有一堆文件需要复制并插入到集合中,只更改所有这些上的parent_id。这需要非常长的时间并且最大化我的CPU。这是我目前的实施。我只需要更改所有文档的parent_id。

// find all the documents that need to be copied
models.States.find({parent_id: id, id: { $in: progress} }).exec(function (err, states) {

    if (err) {
        console.log(err);
        throw err;
    } 

    var insert_arr = [];

    // copy every document into an array
    for (var i = 0; i < states.length; i++) {
        // copy with the new id
        insert_arr.push({
            parent_id: new_parent_id,
            id: states[i].id,
            // data is a pretty big object
            data: states[i].data,
        })
    }

    // batch insert
    models.States.create(insert_arr, function (err) {
        if (err) {
            console.log(err);
            throw err;
        } 
    });
});

这是我正在使用的架构

var states_schema = new Schema({
    id : { type: Number, required: true },
    parent_id : { type: Number, required: true },
    data : { type: Schema.Types.Mixed, required: true }
});

必须有更好的方法来做到这一点,我似乎无法想出。任何建议都非常欢迎!感谢。

1 个答案:

答案 0 :(得分:0)

在这种情况下,在应用层上没有必要这样做。只需在数据库中执行此操作

db.States.find({parent_id: id, id: { $in: progress} }).forEach(function(doc){
  delete doc._id;
  doc.parentId = 'newParentID';
  db.States.insert(doc);
})

如果你真的需要在mongoose中这样做,我会看到以下问题:  您返回符合条件的所有文档,然后迭代它们并将它们复制到另一个数组(修改它们),然后迭代修改后的元素并将它们复制回来。所以这至少比我正在做的事情长3倍。

P.S。如果您需要保存到其他收藏品,则应将db.States.insert(doc)更改为db.anotherColl.insert(doc)

P.S.2 如果你不能从shell中执行此操作,我希望你能找到一种方法将我的查询插入到mongoose中。