Outputting id Only with .find()

Hi all,

I am having a problem when trying to show my other columns in my .find() statement its only outputting the following, how do I make it show my other columns too that are shown in the query.

Console -

Express is running on port 3000
Mongoose connection open on mongodb://localhost:27017/test
School { _id: 5aa93d03f7f57e04503b4695 }

Model -

const mongoose = require('mongoose');

const schoolsSchema = new mongoose.Schema({
  Boarders: {
    type: String,
  },
  Gender: {
    type: String,
  },
   Town: {
    type: String,
  },
});

module.exports = mongoose.model('School', schoolsSchema);
mongoose.Promise = global.Promise;

App.js

app.get('/console', (req, res, next) => {
    School.find({"Boarders": {'$regex': 'No B'}, "Gender": {'$regex': 'Mixed'}, "Town": {'$regex': 'London'}}, {"_id": 0, "Boarders": 1, "Gender": 1, "Town": 1})
        .exec(function (err, items) {
            if (err) { return next(err); }
            var myData = new School(req.body)
            console.log('School', myData);
            res.send('Check console.log for list of items');
        });
});

Html app -

      <h1>Select names to database<h1> 
    <form method="GET" action="/console">
<label>Select gender town <label> 
  
    <input type="submit" value="Select">
    </form>

Isn’t… the purpose of the ‘items’ variable in the exec function to already do this?

If you’re expecting a single response, then findOne would be more appropriate…
If you’re expecting multiple responses,then a loop over items would be more appropriate.

What happens if you instead do:

.exec(function (err, items) {
            if (err) { return next(err); }
            items.forEach(function (item) {
                      console.log('%s: %s %s', item.Town, item.Gender, item.Boarders);
            });
            res.send('Check console.log for list of items');
        });

?

I used the following - nothing happened other than it showed check console.log for list of items

app.get('/console', (req, res, next) => {
    School.find({"Boarders": {'$regex': /No B/}, "Gender": {'$regex': 'Mixed'}, "Town": {'$regex': 'London'}}, {"_id": 0, "Boarders": 1, "Gender": 1, "Town": 1})
        .exec(function (err, items) {
            if (err) { return next(err); }
            items.forEach(function (items) {
                      console.log('%s: %s %s', items.Boarders, items.Gender, items.Town);
            });
            res.send('Check console.log for list of items');
        });
});

I then tried the following for testing and it shows underfined: undefined undefined

app.get('/console', (req, res, next) => {
    School.find({"Boarders": {'$regex': /No B/}, "Gender": {'$regex': 'Mixed'}, "Town": {'$regex': 'London'}}, {"_id": 0, "Boarders": 1, "Gender": 1, "Town": 1})
        .exec(function (err, items) {
            if (err) { return next(err); }
            items.forEach(function (items) {
                      console.log('%s: %s %s', items.Boarders, items.Gender, items.Town);
            });
            res.send('Check console.log for list of items');
            console.log('%s: %s %s', items.Boarders, items.Gender, items.Town);
        });
});

what does console.log(items) show?

I currently get the following

I changed the code to

app.get('/console', (req, res, next) => {
    School.find({"Boarders": {'$regex': /No B/}, "Gender": {'$regex': /Mixed/}, "Town": {'$regex': /London/}})
        .exec(function (err, items) {
            if (err) { return next(err); }
            items.forEach(function (items) {
                      console.log('%s: %s %s', items.Boarders, items.Gender, items.Town);
            });
            res.send('Check console.log for list of items');
            console.log(items)
        });
});

Now I get the following

Express is running on port 3000
Mongoose connection open on mongodb://localhost:27017/test
[]

So… obvious question… does the document collection you’ve connected to actually contain a record that matches your search?

Yes it does its meant to show the following; I tested this with Studio3T

{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }

So what happens if you do a simpler query:

 School.find({"Town": 'London'})

EDIT: Or for that matter, pull ALL the records.

School.find({})

Shows exact same result

Then… are you absolutely sure you’ve connected to the correct datastore and collection? If you run the empty object query, it should dump back every document in the collection…

ok I have started to do it another way

var url = "mongodb://localhost:27017/";

app.get('/console', (req, res, next) => {
mongoose.connect(url, function(err, db) {
  if (err) throw err;
  var dbo = db.db("CSV");
  dbo.collection("Schools").find({"Boarders": {'$regex': /No B/}, "Gender": {'$regex': /Mixed/}, "Town": {'$regex': /London/}}).toArray(function(err, result) {
    if (err) throw err;
    console.log(result);
    db.close();
  });
});
});

its looking more promosing but errors currently include

(node:12108) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: db.db is not a function
(node:12108) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Well, that seems like a rather obvious error…
console.log(db)

instead of console.log(result); ?

The error messages you’re getting sound like the connection to your database failed.

I have routed back to the previous code as the W3Schools tutorial did not help

app.get('/console', (req, res, next) => {
    Schools.find({Boarders: {'$regex': /No B/}, Gender: {'$regex': 'Mixed'}, Town: {'$regex': 'London'}}, {_id: 0, Boarders: 1, Gender: 1, Town: 1})
        .exec(function (err, items) {
            if (err) { return next(err); }
            items.forEach(function (items) {
                   console.log('%s: %s %s', items.Boarders, items.Gender, items.Town);  
            });
            res.send('Check console.log for list of items'); 
            console.log('%s: %s %s', items.Boarders, items.Gender, items.Town);
        });
});

When I click the button in html it now shows

Express is running on port 3000
Mongoose connection open on mongodb://localhost:27017/test
Mongoose connection open on mongodb://localhost:27017/CSV
undefined: undefined undefined

So it is going into the CSV database as its CSV.Schools although it is coming up as undefined

Just… for SAG, lets try this…

app.get('/console', (req, res, next) => {
    var entry = new Schools({'Town':'London','Gender':'Mixed','Boarders':'No B'})
    entry.save(function (err) { console.log("Couldn't write.") });

    Schools.find({Boarders: {'$regex': /No B/}, Gender: {'$regex': 'Mixed'}, Town: {'$regex': 'London'}}, {_id: 0, Boarders: 1, Gender: 1, Town: 1})
        .exec(function (err, items) {
            if (err) { return next(err); }
            items.forEach(function (items) {
                   console.log('%s: %s %s', items.Boarders, items.Gender, items.Town);  
            });
            res.send('Check console.log for list of items'); 
            console.log('%s: %s %s', items.Boarders, items.Gender, items.Town);
        });
});

hmm very interesting
so it spits out the following


Express is running on port 3000
Mongoose connection open on mongodb://localhost:27017/test
Mongoose connection open on mongodb://localhost:27017/CSV
No B: Mixed London
/No B/: /Mixed/ /London/
undefined: undefined undefined
Couldn't write.

I changed the code a little too

app.get('/console', (req, res, next) => {
    var entry = new Schools({"Town":/London/,"Gender":/Mixed/,"Boarders":/No B/})
    entry.save(function (err) { console.log("Couldn't write.") });

    Schools.find({Boarders: {'$regex': /No B/}, Gender: {'$regex': 'Mixed'}, Town: {'$regex': 'London'}}, {_id: 0, Boarders: 1, Gender: 1, Town: 1})
        .exec(function (err, items) {
            if (err) { return next(err); }
            items.forEach(function (items) {
                   console.log('%s: %s %s', items.Boarders, items.Gender, items.Town);  
            });
            res.send('Check console.log for list of items'); 
            console.log('%s: %s %s', items.Boarders, items.Gender, items.Town);
        });
});

Well i’ve flubbed the code slightly.

app.get('/console', (req, res, next) => {
    var entry = new Schools({"Town":/London/,"Gender":/Mixed/,"Boarders":/No B/})
    entry.save(function (err) { if (err) { raise err; });

    Schools.find({Boarders: {'$regex': /No B/}, Gender: {'$regex': 'Mixed'}, Town: {'$regex': 'London'}}, {_id: 0, Boarders: 1, Gender: 1, Town: 1})
        .exec(function (err, items) {
            if (err) { return next(err); }
            items.forEach(function (items) {
                   console.log('%s: %s %s', items.Boarders, items.Gender, items.Town);  
            });
            res.send('Check console.log for list of items'); 
        });
});

The response you got seems to indicate the collection you’re connecting to is empty, because it managed to successfully return the object that I wrote into the collection just there…

Ok great yep I have tested it and it comes up with

Express is running on port 3000
Mongoose connection open on mongodb://localhost:27017/test
Mongoose connection open on mongodb://localhost:27017/CSV
No B: Mixed London
/No B/: /Mixed/ /London/
/No B/: /Mixed/ /London/
/No B/: /Mixed/ /London/
/No B/: /Mixed/ /London/
/No B/: /Mixed/ /London/
/No B/: /Mixed/ /London/
/No B/: /Mixed/ /London/

I need to try and output the following, I know my model works because we have just tested it so do you believe its the connection to the collection that is causing this or could it be the statement I am using

I just copied this from Studio3T into here so I know it works but I need to try and connect it somehow

db.Schools.find({"Boarders": {'$regex': 'No B'}, "Gender": {'$regex': 'Mixed'}, "Town": {'$regex': 'London'}}, {"_id": 0, "Boarders": 1, "Gender": 1, "Town": 1});

The results -

{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }
{ "Town" : "London", "Boarders" : "No Boarders", "Gender" : "Mixed" }

Which database is Studio3T connected to? You’ve defined two - test and CSV. You’ve defined a collection within it, “Schools”, though originally your model pointed to a collection named School rather than Schools…