In this project, you will create a movie database in MongoDB. You will first provide database functions that import, aggregate and relate the data, in order to begin to make the structure of it useful. In subsequent deliverables you will continue to refine the database structure will using technologies such as Node.js and Express.js to present the movie data, as a website, to users.

Deliverables:

D1: Relating Movies and Credits

In this deliverable, you will create a movie database in MongoDB, and provide functions on it. You need to use Javascript or Python 2.7 for this deliverable (do not use Node).

Among the goals for this project are for you to learn about how to organize collections of data in MongoDB, with different relational and index structures, to meet different computational / user needs. As part of this, you need to understand Mongo Object IDs and differentiate them from other ids that are part of external data.

  1. Read the cast and crew objects into their own MongoDB credits collection. This, "the lesser way", resembles what you would do with a relational database.
  2. Iterate through the array of credits objects. For each, directly merge the cast and credits into the matching movie record (like the orders for a customer, which we discussed in lecture).
    This, "the better way" is REQUIRED FOR HONORS STUDENTS.
    It will provide 5 points of extra credit for others.
  3. For 10 extra points, to support person-centered browsing, create a collection of persons, each corresponding to cast and crew entries. Do not allow multiple entries for the same id / person. Include a movies collection, of MongoDB OBJECT_IDs, inside of each person entry.
    Provide a function
    getPersonById(person_id) that returns a composite object that includes the person data and their associated movies.

 

teamwork → development log

Be strategic to divide the work among team members.  You may also want to sometimes work together on the same thing. Be thoughtful. Ensure that all teammates are up-to-date and on the same page.

submission

  1. Create a user with READ ONLY role: https://docs.mongodb.com/manual/tutorial/create-users/
  2. Connect remotely to the instance using the user credentials.

mongo --username user --password pass --host hostname --port port_number

(e.g. mongo --username alice --password abc123 --host mongodb0.tutorials.com --port 28015)

For more details, see:

https://docs.mongodb.com/tutorials/connect-to-mongodb-shell/

D2: Movies Web

[In GitHub, create a separate branch for this deliverable. See submission instructions for details.]

In this deliverable, you will create a movies website. Think of it as resembling IMDb. As a conceptual starting point, consider what you like and dislike about IMDb and any other movies websites that you use. You can also consider the website tmdb.org, which is where our data came from. Keep these story ideas in mind, as you design the user experience and look and feel of your Movies Website.

Remember: carefully read the data you were given. Understand it! Perhaps make one member of your team the data expert. Get some website to pretty print JSON values and stare at them long enough so you understand the story they tell.

Note: here is how to form URLs with the image file data that you find in the JSON:

Begin by performing thinnest architectural spike components with a Node.js stack.

  1. You will use a URL, http://your_box_hostname:port, to do this. Below, we will call this your_web_app_url. Make sure to save this and share it among your teammates.
  1. name
  2. id
  3. role (character or department and its value)
  4. img_path
  1. Return useful data about a person, as JSON. You may notice, our dataset is relatively impoverished for each person, compared to the movie data.

    If you have not already, use the credits data to create a collection of unique persons in order to support this function. The base part of each person record should include at least:
  1. Also, aggregated in each person object should be one array of objects representing the movies in which they function as cast, and another array of the movies in which they function as crew. One of these arrays may be empty. Internally, each array entry should include:

When you return data, in the service, convert these arrays of movie objects, with Object IDS, into JSON entries, each of which includes the data you would want to present inside a person web page or in search results for a person. These include (you could want more than this!) at least:

  1. id of the movie or person
  2. title of the movie or name of the person. (You could choose to use the same label for both of these fields, even though they are different in the input data.)
  3. img_path
  4. role (character or department)
  1. For 10 extra points, effectively present the top 10 grossing films in the collection.
  1. For 5 extra points, incorporate a link to the IMDb page for each movie.
  2. For 10 extra points, incorporate a link to Wikipedia page for each movie.
  1. For 5 extra points, incorporate a link to the IMDb page for each person
  2. For 10 extra points, incorporate a link to Wikipedia page for each person.
  3. For 15 extra points, incorporate biography information for each person, which you would obtain from Wikipedia, IMDb, or some other web source.

d2 submission

“P” + projectNumber + “D” + deliverableNumber

So, for this deliverable, title your branch P1D2.

D3: Website Experience

Improve the user experience of your movies website. Improve both the interface and, as appropriate, backend functionality.

Of course, again, incorporate visual information design principles addressed by Tufte and interaction design principles addressed by Norman.

As part of this, finish / improve components of your previous deliverable. Additionally, develop these new functionalities:

agile development

GitHub allows you to create agile boards and backlogs, assign issues, and track progress. For this deliverable, engage in an agile development cycle, by following the steps listed here.

Make sure to:

Your team’s processes will be graded.

d3 submission

“P” + projectNumber + “D” + deliverableNumber

So, for this deliverable, title your branch P1D3.