0

我在一个集合中有一堆文档,我需要复制并插入到集合中,只更改所有文档的 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 }
});

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

4

1 回答 1

0

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

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

如果您真的需要在猫鼬中执行此操作,我会看到以下问题:您返回所有符合您的条件的文档,然后遍历它们并将它们复制到另一个数组中(修改它们),然后遍历修改后的元素并复制他们回来了。所以这至少是我正在做的事情的 3 倍。

PS如果你需要保存到不同的集合,你应该db.States.insert(doc)改为db.anotherColl.insert(doc)

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

于 2013-11-10T06:59:00.240 回答