2017-10-14 6 views
0

Je me cognais la tête dans le mur, donc toute aide serait grandement appréciée. Avec MongooseJS, je fais un Model.find puis je fais une boucle sur ces résultats et je fais un findAndUpdate. (En gros, obtenir la liste des URL de MongooseJS, "ping" chaque URL pour obtenir un statut, puis mettre à jour la DB avec le statut).MongooseJS findAndUpdate dans la boucle de recherche

Schéma

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 
}) 

Voici un extrait de code:

// 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) 
}) 

Avec le débogage, je peux voir que le .Find() reçoit les données que je veux. Cependant, il semble qu'il findOneAndUpdate dans le .find() ne s'exécute jamais (item.url est réglé correctement) et je ne reçois aucune erreur, il ne fonctionne pas.

Toute aide serait grandement appréciée.

Répondre

0

Vous pouvez y parvenir sans find et update vous pouvez le faire en une seule update opération

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

Si vous devez faire une boucle sur des éléments pour des raisons spécifiques pour gérer urls essayez le code ci-dessous

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 Connexion:

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

J'apprécie votre aide. Je dois faire une boucle dans la liste de trouver, je mets dans votre code, et il n'exécute toujours pas la mise à jour (via le débogage je vois l'exécution de .find(), mais pas le .update) –

+0

êtes-vous sûr que cet article et '' 'item.url''' dedans' '' forEach''' donne les valeurs attendues ... aussi quel est le schéma de '' 'Server''' pouvez-vous s'il vous plaît mettre à jour la question avec le schéma? –

+0

Ajout du schéma. Oui, si je mets un console.log (requête) juste avant le Server.findOneAndUpdate, il sort correctement. –