Harry Moreno
Harry Moreno

Reputation: 11603

cursor has no method next

I'm trying to traverse a collection and update an array for each document. What am I doing wrong below?

var MongoClient = require('mongodb').MongoClient;

var removeLowestHWScore = function(scores) {
  var lowestHWID = -1;
  for(var i=0;i<scores.length; i++) {
    if (scores[i].type === 'homework') {
      if (lowestHWID === -1) {
        lowestHWID = i;
      } else if (scores[i].score < scores[lowestHWID].score) {
        lowestHWID = i;
      }
    }
  }
  scores.splice(lowestHWID);
  return scores;
};

var callback = function(err, r) {
  console.log('updated record');
};

var updateScore = function(err, doc) {
  var updatedScores = removeLowestHWScore(doc.scores);
  collection.updateOne({_id:doc._id},
                       {$set: {scores: updatedScores }},
                       callback);
};

MongoClient.connect('mongodb://localhost:27017/school', function(err, db) {
  if(err) throw err;

  var collection = db.collection('students');
  var cursor = collection.find({});

  var next = cursor.next();
  while (next) {
    next(updateScore);
    next = cursor.next();
  }
  db.close();
});

error

/Users/harrymoreno/programming/mongodb/mongo101ForNode/node_modules/mongodb

/lib/mongodb/mongo_client.js:475
      throw err
            ^
TypeError: Object #<Cursor> has no method 'next'
at     /Users/harrymoreno/programming/mongodb/mongo101ForNode/week03/app.js:35:21
at     /Users/harrymoreno/programming/mongodb/mongo101ForNode/node_modules/mongodb/lib/mongodb/mongo_client.js:472:11
at process._tickCallback (node.js:419:13)

sample student

{
    "_id" : 137,
    "name" : "Tamika Schildgen",
    "scores" : [
        {
            "type" : "exam",
            "score" : 4.433956226109692
        },
        {
            "type" : "quiz",
            "score" : 65.50313785402548
        },
        {
            "type" : "homework",
            "score" : 89.5950384993947
        }
    ]
}

Upvotes: 0

Views: 1428

Answers (1)

user2941651
user2941651

Reputation:

UPDATED - v.2

According to the information provided in your last remark abut mongodb package version, I've changed to solution to the one you've improved for specific version compliance (using the 1.4.x node.js mongodb driver) :

var MongoClient = require('mongodb').MongoClient;

var cursor = null,
    collection = null,
    dbSrc = null;

var removeLowestHWScore = function(scores) {
  var lowestHWID = -1;
  for(var i=0;i<scores.length; i++) {
    if (scores[i].type === 'homework') {
      if (lowestHWID === -1) {
        lowestHWID = i;
      } else if (scores[i].score < scores[lowestHWID].score) {
        lowestHWID = i;
      }
    }
  }
  // scores.splice(lowestHWID);
  if (lowestHWID >= 0)
    scores.splice(lowestHWID, 1);
  return scores;
};

var callback = function(err, r) {
  if (err) throw err;
  console.log('updated record');
  cursor.nextObject(updateScore);
};

var updateScore = function(err, doc) {
  if (err) throw err;

  if (doc === null)
    return dbSrc.close();
  var updatedScores = removeLowestHWScore(doc.scores);
  collection.update({_id:doc._id},
                       {$set: {scores: updatedScores }},
                       callback);
};

MongoClient.connect('mongodb://localhost:27017/school', function(err, db) {
  if(err) throw err;

  dbSrc = db;
  collection = db.collection('students');
  cursor = collection.find({});

  cursor.nextObject(updateScore);
});

Upvotes: 2

Related Questions