moaningalways
moaningalways

Reputation: 461

mongoose forEach loop and update documents one by one

I want to query a collection and update each document using some value that i will get from another query which is gonna be built with some info from the returned document.

const mongoose = require('mongoose');
const userModel = {
      country: { type: String }
      newField: { type: String } 
     };
const myUsersModel = mongoose.model('user',userModel); 
myUsersModel.find({country:"USA"}).forEach(function (doc) {

    // another query here into a relation Database:
    let anotherQuery = 'SELECT * FROM myTable WHERE name=' + doc.name;
    mySQLConnection.query(
            anotherQuery,
            function selectCb(err, results, fields) {
                if (err) {
                    console.log("ERROR: " + err.message);
                    throw err;
                }
                console.log("Got "+results.length+" Rows:");
                let updatedInfo = results.SomeField;

                // update the mongoose doc:
                doc.newField = updatedInfo;
                myUsersModel.save(doc);

            });
        mySQLConnection.end(function(err) {
          console.log("connection ended.");
        });
        mongoose.connection.close();
    });

I am getting the following error:

TypeError: myUsersModel.find(...).forEach is not a function

Upvotes: 1

Views: 6076

Answers (2)

Andrey Shcherbakov
Andrey Shcherbakov

Reputation: 138

myUsersModel.find({country:"USA"})
   .then(users=>users.forEach //users might be null here btw

Or if you want to keep your callback style

myUsersModel.find({country:"USA"}, function(err, users) {
  if (err) throw err;
  users.forEach

Upvotes: 3

endling
endling

Reputation: 84

If a callback is not provided, Model.find returns an instance of Query and not an instance of Array. Hence, you can not use forEach as Query is not an Array.

Upvotes: 0

Related Questions