2017-10-14 37 views
0

一直在我的頭撞在牆上,所以任何幫助將不勝感激。使用MongooseJS,我正在做一個Model.find,然後遍歷這些結果並執行findAndUpdate。MongooseJS findAndUpdate內查找循環

(基本上,從MongooseJS獲取URL的列表,「ping」每個URL以獲得狀態,然後用狀態更新DB)。

架構

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()中找到了OneAndUpdate(永遠不會運行)(item.url設置正確),並且我沒有收到任何錯誤,它只是不運行。

任何幫助將非常感激。

回答

0

可以實現,如果沒有find然後update你只能在一個update操作

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

做到這一點如果你需要在項目的具體原因來處理的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()運行,但不是.update) –

+0

你確定這個項目'''forEach''裏面的'''item.url''給出了期望的值...還有'''''''''''''''''什麼是架構'你可以請用模式更新問題嗎? –

+0

添加了模式。是的,如果我在Server.findOneAndUpdate之前放置一個console.log(查詢),它會正確輸出。 –