asynchronous

node.js

mongodb

mongoose

I'm running this code on node.js

var mongoose = require('mongoose');
mongoose.model('participant',new mongoose.Schema({},{ collection : 'forumParticipant' }));
var Participant = mongoose.model('participant');
mongoose.connect('******');

Participant.find({entity_id: 0}, function (err, docs) {
   console.log(docs[0]);
   console.log(docs[0].entity_id)
});

1) The first console.log return the full document

2) The second console.log return undefinied

I don't understand why.

I need to perform something like

var participants = docs.map(function(d){return d.user_id})

How can I achieve that? What am I missing ?

Solution 1

I suspect the value you are trying to get is not in your Schema but is stored in your database.

You have two solutions from there. You can either add entity_id to your Schema and Mongo will be able to bind it to the Document object you receive. This is the recommended way.

Or you can bypass mongoose Schema and access the raw document stored in the database with docs[0]._doc.entity_id. I don't recommend this solution unless you know what you're doing.

Solution 2

Mongoose does funky stuff when it comes to accessing model properties. Your best bet whenever you're having problems, is either to use .lean() as part of your query, or call .toObject() on the output to convert the model into a plain JS object.

e.g. using .toObject()

Participant.find({entity_id: 0}, function (err, docs) {
   console.log(docs[0].toObject());
   console.log(docs[0].toObject().entity_id)
});

e.g. using lean()

Participant.find({entity_id: 0}).lean().exec(function (err, docs) {
   console.log(docs[0]);
   console.log(docs[0].entity_id)
});

Solution 3

Partipant.find({entity_id: 0})

The above find() returns the array of documents from DB

You can access the value of each record

docs.map((d)=>{
    console.log(d.get('user_id'))
})