var currentClassroom = null; var courseInstances = {}; var count = 0; load('node_modules/lodash/lodash.js'); function toStrings(array) { return _.sortBy(_.map(array, function(item) { return item.valueOf(); })); } function mergeMembers(members1, members2) { var members1 = members1 || []; var members2 = members2 || []; var members = members1.concat(members2); if(!members.length) return []; print('concat:'); print('\t', members1.length, JSON.stringify(toStrings(members1))); print('\t', members2.length, JSON.stringify(toStrings(members2))); print('\t', members.length, JSON.stringify(toStrings(members))); members = _.uniq(members, false, function(member) { return member.valueOf() }); print('\t', members.length, JSON.stringify(toStrings(members))); return members; } var count = 0; db.course.instances.find({classroomID: {$exists: true}}).sort({classroomID: 1}).forEach(function(courseInstance) { count += 1; if(count % 100 === 0) { print('count', count); } if (!currentClassroom || !courseInstance.classroomID.equals(currentClassroom)) { currentClassroom = courseInstance.classroomID; courseInstances = {}; } if (courseInstances[courseInstance.courseID]) { var keeper = courseInstances[courseInstance.courseID]; if (!keeper.classroomID.equals(courseInstance.classroomID)) { throw new Error('This should not happen.'); return; } print('duplicate...', count, 'in classroom', courseInstance.classroomID, keeper.members.length, courseInstance.members.length); print(JSON.stringify(courseInstance, null, '\t')); print(JSON.stringify(keeper, null, '\t')); keeper.members = mergeMembers(keeper.members, courseInstance.members); print('new members', keeper.members.length); print('save', db.course.instances.save(keeper)); print('remove', db.course.instances.remove({_id:courseInstance._id}), true); print('keeper id', keeper._id) } else { courseInstances[courseInstance.courseID] = courseInstance; } });