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シェルからこれを行うことができない場合は、クエリを mongoose に挿入する方法を見つけていただければ幸いです。

于 2013-11-10T06:59:00.240 に答える