diff --git a/scripts/mongodb/queries/coursesV1Beta.js b/scripts/mongodb/queries/coursesV1Beta.js new file mode 100644 index 000000000..0f86d7111 --- /dev/null +++ b/scripts/mongodb/queries/coursesV1Beta.js @@ -0,0 +1,65 @@ +// Grab course instance data for Courses v1 Beta + +// Usage: +// mongo <address>:<port>/<database> <script file> -u <username> -p <password> + +// TODO: order by average levels completed + +function objectIdWithTimestamp(timestamp) +{ + // Convert string date to Date object (otherwise assume timestamp is a date) + if (typeof(timestamp) == 'string') timestamp = new Date(timestamp); + // Convert date object to hex seconds since Unix epoch + var hexSeconds = Math.floor(timestamp/1000).toString(16); + // Create an ObjectId with that hex timestamp + var constructedObjectId = ObjectId(hexSeconds + "0000000000000000"); + return constructedObjectId +} + +var betaStartDate = new ISODate('2015-10-08'); +var minMembers = 9; + +var classes = []; +var ownerIDs = []; +var cursor = db['course.instances'].find({$and: [ + {_id: {$gte: objectIdWithTimestamp(betaStartDate)}}, + {$where: 'this.members.length > ' + minMembers} +]}).sort({_id: 1}); +while (cursor.hasNext()) { + var doc = cursor.next(); + var ownerID = doc.ownerID; + ownerIDs.push(ownerID); + if (!classes[ownerID.valueOf()]) classes[ownerID.valueOf()] = []; + classes.push({ + courseID: doc.courseID, + courseInstanceID: doc._id, + url: 'codecombat.com/courses/' + doc.courseID.valueOf() + '/' + doc._id.valueOf(), + ownerID: doc.ownerID, + createDate: ownerID.getTimestamp(), + memberCount: doc.members.length, + name: doc.name + }); +} + +var userMap = {}; +cursor = db.users.find({_id: {$in: ownerIDs}}); +while (cursor.hasNext()) { + var doc = cursor.next(); + if (!userMap[doc._id.valueOf()]) userMap[doc._id.valueOf()] = {}; + userMap[doc._id.valueOf()].emailLower = doc.emailLower; + userMap[doc._id.valueOf()].name = doc.name; +} + +for (var i = 0; i < classes.length; i++) { + classes[i].email = userMap[classes[i].ownerID.valueOf()].emailLower; +} + +classes.sort(function(a, b) { + return b.memberCount - a.memberCount; +}); + +for (var i = 0; i < classes.length; i++) { + print(classes[i].url + '\t' + classes[i].memberCount + '\t' + classes[i].email + '\t' + classes[i].name); +} + +print(classes.length + ' course instances with over ' + minMembers + ' members');