2016-08-31 3 views
2

モンゴースやモンゴだけでもこのようなことが可能ですか?mongoose .updateクエリでは、更新パラメータのフェッチされたレコードを参照できますか?

Center.update({ghostBuster:{$exists}},{$set:{ectoplasm: this.exoplasm},$unset: {exoplasm:""}}, function(err, result){ })

私はそれを更新して、私はそのフェッチされたレコードを参照できので、もし私が、レコード数を更新し、別のフィールドに1つのフィールドを移動したいと思います。この場合、ectoplasmフィールドにexoplasmの値を設定しています

Mongooseスキーマにフックを定義することなくこれを行うことはできますか?

答えて

0

モンゴを使用すると、(forEach()メソッドを使用して)検索クエリから返されたカーソルを繰り返すことによって、これを行うと、ループ内でコレクションを更新することができます。例:

db.centers.find({ 
    "ghostBuster": { "$exists": true } 
}).forEach(function(doc){ 
    db.centers.update(
     { "_id": doc._id }, 
     { 
      "$set": { "ectoplasm": doc.exoplasm }, 
      "$unset": { "exoplasm": "" } 
     } 
    ) 
}); 

サーバーへの「前後」は、IOでコストがかかるため、最小化しようとします。

var ops = []; 

db.centers.find({ 
    "ghostBuster": { "$exists": true } 
}).forEach(function(doc) { 
    ops.push({ 
     "updateOne": { 
      "filter": { "_id": doc._id }, 
      "update": { 
       "$set": { "ectoplasm": doc.exoplasm }, 
       "$unset": { "exoplasm": "" } 
      } 
     } 
    }); 

    if (ops.length === 1000) { 
     db.centers.bulkWrite(ops); 
     ops = []; 
    } 
}) 

if (ops.length > 0) db.centers.bulkWrite(ops); 

かのMongoDBの2.6.xと3.0.xのリリースのBulk operationsのこのバージョンを使用します:

一括で更新を行うには bulkWrite()方法を(MongoDBのバージョン3.2を使用している場合)を使用し

両方の場合のバルク操作APIは、処理するコレクション内の1000個のドキュメントごとに1回だけ要求を送信することで、サーバーのIO負荷を軽減するのに役立ちます。マングースと同等の場合


、あなたはnode.js.におけるバルクAPIの非同期な性質を処理するための約束を使用して次のようなものを実装することができます 根底にあるバルク・オペレーション・APIを使用するためには、マングースモデルから.collectionプロパティ経由でアクセスする必要があります。 APIを使用する前に、それはマングースの内部バッファリングシステムでは動作しませんので、マングースが本当に、まだ"initializeOrderedBulkOp()"機能をサポートしていないので、成功したDBに接続するためにマングースのを待ちます。

var mongoose = require('mongoose'), 
    express = require('express'), 
    Promise = require('bluebird'), 
    Schema = mongoose.Schema; 

function connect(uri, options){ 
    return new Promise(function(resolve, reject){ 
     mongoose.connect(uri, options, function(err){ 
      if (err) return reject(err); 
      resolve(mongoose.connection); 
     }); 
    }); 
} 

var centerSchema = new Schema({ 
    exoplasm: Number, 
    ghostBuster: Number, 
    time: Date 
}, { collection: "centers" }); 

var Center = mongoose.model("Center", centerSchema); 

/* 
function bulkUpdate(Model){  
    return new Promise(function(resolve, reject){ 
     var bulk = Model.collection.initializeUnorderedBulkOp(), 
      counter = 0; 

     Model.find({ "ghostBuster" : { "$exists": true } }) 
      .lean().exec(function (err, docs) { 
      if (err) return reject(err); 

      docs.forEach(function (doc){ 
       counter++; 

       bulk.find({ "_id": doc._id }).updateOne({ 
        "$set": { "ectoplasm": doc.exoplasm }, 
        "$unset": { "exoplasm": "" } 
       }); 

       if (counter % 500 == 0) { 
        bulk.execute(function(err, result) { 
         if (err) return reject(err);       
         bulk = Model.collection.initializeUnorderedBulkOp();       
         resolve(result); 
        }); 
       }      
      });  

      if (counter % 500 != 0) {    
       bulkUpdateOps.execute(function(err, result) { 
        if (err) return reject(err); 
        resolve(result); 
       });   
      }   
     });  
    }); 
} 
*/ 

function bulkUpdate(Model){  
    return new Promise(function(resolve, reject){ 
     var ops = [], 
      collection = Model.collection; 

     Model.find({ "ghostBuster" : { "$exists": true } }) 
     .lean().exec(function (err, docs) { 
      if (err) return reject(err); 

      docs.forEach(function (doc){ 
       ops.push({ 
        "updateOne": { 
         "filter": { "_id": doc._id }, 
         "update": { 
          "$set": { "ectoplasm": doc.exoplasm }, 
          "$unset": { "exoplasm": "" } 
         } 
        } 
       }); 

       if (ops.length === 1000) { 
        collection.bulkWrite(ops, function(err, result) { 
         if (err) return reject(err);       
         ops = []; 
         resolve(result); 
        }); 
       }      
      });  

      if (ops.length > 0) {    
       collection.bulkWrite(ops, function(err, result) { 
        if (err) return reject(err); 
        resolve(result); 
       });   
      }   
     });  
    }); 
} 


connect('mongodb://localhost/test', {}).then(function(db){ 
    bulkUpdate(Center).then(function(res){ 
     console.log('Bulk update complete.', res);  
    }, function(err){ 
     console.log('Bulk Error:', err); 
     db.close(); 
    }); 
}, function(err){ 
    console.log('DB Error:', err); 
}); 
関連する問題