MongooseJS在Find循环中查找和更新

时间:2017-10-14 12:12:26

标签: node.js mongoose

一直在墙上敲我的头,所以任何帮助都会非常感激。使用MongooseJS,我正在做一个Model.find,然后循环遍历这些结果并执行findAndUpdate。

(基本上,从MongooseJS获取URLS列表,“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()中的findOneAndUpdate从不运行(item.url设置正确)而且我没有得到任何错误,它只是没有运行。

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

您可以在没有find然后update的情况下实现这一目标,您只能在update次操作中执行此操作

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

如果您因特定原因需要循环处理网址,请尝试下面的代码

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