2017-10-14 7 views
0

これで壁に頭をぶつけてしまったので、どんな助けでも大歓迎です。 MongooseJSでは、Model.findを実行してから、その結果をループしてfindAndUpdateを実行しています。Find loop内のMongooseJS findAndUpdate

(基本的には、MongooseJSからのURLのリストを取得し、各URLをpingしてステータスを取得し、ステータスを更新します)。

スキーマ

var serverSchema = new Schema({ 
    github_id: { type: String, required: true }, 
    url: { type: String, required: true }, 
    check_interval: Number, 
    last_check: { 
    response_code: Number, 
    message: String, 
    time: Date 
    }, 
    created_at: Date, 
    updated_at: Date 
}) 

は、ここでは、コードスニペットです:

// Doesn't work 
Server.find(function (err, items) { 
    if (err) return console.log(err) 
    items.forEach(function (item) { 
    var query = {url: item.url} 
    Server.findOneAndUpdate(query, {updated_at: Date.now()}, function (err, doc) { 
     if (err) return console.log(err) 
     console.log(doc) 
    }) 
    }) 
}) 

// Works! 
var query = {url: 'https://google.com'} 
Server.findOneAndUpdate(query, {updated_at: Date.now()}, function (err, doc) { 
    if (err) return console.log(err) 
    console.log(doc) 
}) 

上のデバッグを、私は.find()は私が望むデータを取得していることがわかります。しかし、彼は.find()内のfindOneAndUpdateは決して実行されないようです(item.urlは正しく設定されています)。エラーは出ません。実行されません。

助けがあれば幸いです。

答えて

0

あなたが1個のときupdate操作

Server.update({}, { $set: { updated_at: Date.now() } }, function(err, doc) { 
    if (err) return console.log(err) { 
     console.log(doc) 
    } 
}) 

でこれを行うことができますupdateその後、findせずにそれを達成することができますが

下のコードを試し、その後URLを処理するための具体的な理由のための項目では、ループする必要があり
var Server = require('../models/server'); 
Server.find(function(err, items) { 
     if (err) { 
      return console.log(err) 
     } else { 
      items.forEach(function(item) { 
       var query = { url: item.url } 
       Server.update(query, { $set: { updated_at: Date.now() } }, function(err, doc) { 
        if (err) return console.log(err) 
        console.log(doc) 
       }) 
      }) 
     } 
    }) 

のMongoDB接続:

var secrets = require('./secrets'); 
var mongoose = require('mongoose'); 

module.exports = function() { 
    var connect = function() { 
     var mongoLink = ""; 
     if (process.env.NODE_ENV === 'production') { 
      mongoLink = secrets.db.prod; 
     } else { 
      mongoLink = secrets.db.dev; 
     } 

     mongoose.connect(mongoLink, function(err, res) { 
      if (err) { 
       console.log('Error connecting to: ' + mongoLink + '. ' + err); 
      } else { 
       console.log('Connected to: ' + mongoLink); 
      } 
     }); 
    }; 
    connect(); 

    mongoose.connection.on('error', console.log); 
    mongoose.connection.on('disconnected', connect); 
} 
+0

私はあなたの助けに感謝します。 findからリストをループする必要があります。私はあなたのコードに入れます。そしてそれはまだアップデートを実行しません(.find()の実行を参照してください。)。 –

+0

あなたはその項目'' forEach'''の中の '' item.url''は期待値を与えています... '' 'Server''のスキーマは何ですか?あなたはスキーマで質問を更新できますか? –

+0

スキーマが追加されました。はい、Server.findOneAndUpdateの直前にconsole.log(クエリ)を置くと正しく出力されます。 –