Mongodb return array of strings instead array of objects
You don't need to do anything special. Just change one thing in your code:
Your code
UserMdl.find().exists('token').select('token').exec(function onUsersFound(err, userMdls) {
console.log(userMdls); // (*) Change this to...
});
Change
UserMdl.find().exec((err, users) => {
console.log(users.map(user => user.token)); // ...(*) to this
});
No need to use select
& exists
functions
EDIT
The best option is Mongoose distinct function:
const tokens = await UserMdl.distinct('token');
If you want condition then:
const tokens = await UserMdl.find(/* condition */).distinct('token');
Thats it
There is a way to select only tokens that require less processing using the mongodb aggregation framework
UserMdl.aggregate(
{ $match: { token : { $exists : true }}},
{ $project: { _id: 0, token: 1 }},
function onUsersFound(err, tokens) {
console.log(tokens);
});
);
This constructs an aggregation pipeline that first matches all documents that have a token field and then selects the token field and suppresses _id selection by using _id : 0
in the $project
pipeline step.
The post processing step would look like this:
function postProcess(tokenObjects) {
if (!tokenObjects) {
return [];
}
return tokenObjects.map(function(tokenObject) { return tokenObject.token; });
}
See also the mongoose docs for more detail on the aggregation function.