JavaScript Building a MEAN Application Setting Up MongoDB Creating Seed Data

Lucas Santos
Lucas Santos
19,315 Points

seed.js code not clear, I have a question

seed.js

'use strict';

var Todo = require('./models/todo.js');

var todos = [
    'Walk Dog',
    'Take out Trash',
    'Study'
];

todos.forEach(function(todo, index){
    Todo.find({'name': todo}, function(err, todos){
        if(!err && !todos.length){
            Todo.create({completed: false, name: todo});
        }
    });
});

I have couple of questions that were not clarified in this video that I wanted to be 100% sure of and not 99.9%.

  1. The forEach method used on the todo is the one from AngularJs correct?

  2. The second parameter of the callback function in the find method Huston uses the variable todos which in my opinion is really bad to do because it can be extremely confusing with the todos array on top. The second argument of the callback after the err argument is the result of the find method within that foreach loop meaning it is returning one todo at a time and not multiple "todos" so using the plural of todo is also really confusing as it is only returning one at a time. So I guess the question here would be. . . am I wrong about this? That todos second parameter was very confusing even for someone who understands MEAN. Should of just named it todoResult

  3. And last but not least is in the if statement he used !todos.length to check if the todo exists. I have never seen someone use that logic to check if an array exists. Can someone elaborate on that little piece of logic and what he is trying to accomplish because from what I understood he is trying to check if the result of the find method does not exist.

if(!err && !todos.length)

Thank you.

2 Answers

Hey.

  1. Yep, i think so.

  2. Yeah, in this Situation, i might be better to name it todoResult or something like this. Just note: the find method could return multiple documents. For example, if you had a field called Category and you would search after this, it would return all the documents within the given parameter. So you are wrong about thinking it returns only one document, because you are in the forEach loop - it returns only one document, because there is just one Todo with each Name..

  3. From what i know, this is pretty common is Javascript. You are right, he is just checking if the Todo already exists. obviously, if the todo doesn't exists, the result of "todos.length" is 0..

Jonathan Cousins
Jonathan Cousins
7,508 Points
  1. Isn't .forEach a standard method of the Array.prototype?
Ken Howard
STAFF
Ken Howard
Treehouse Guest Teacher

Hey Lucas Santos ...

1) We are leveraging the Array.prototype.forEach method in this example. You can find documentation here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

2) Todo.find returns an array. We are searching the entire collection of Todos stored in MongoDB and the result will always be an array of Todos. So the naming here, while it conflicts with the seed array's variable name, is still accurate since the response is an array.

3) Because we know the response will be an array (if not an error) we just need to check if the length is falsy. The problem we are solving is just avoiding duplicate seed data in the database.

I hope this clarifies things a bit.

Lucas Santos
Lucas Santos
19,315 Points

Hey Ken thanks for the reply. I understand now, mongooses methods were throwing off my logic. I see if the collection has nothing in it the the seed data is injected and creates the record.

Thanks Ken appreciate it!

Anthony c
Anthony c
20,907 Points
  • Is there a reason he used create instead of Todo.insert?
  • This is seeding the actual mongo database correct?