Search code examples
javascriptnode.jsmongodbmongoosemongoose-schema

Mongoose fetch all key values from a collection and put into an array


How do I fetch all keys named 'username' and 'username' with 'password'(password hash) into two separate arrays? What I've tried so far:

const mongoose = require('mongoose');
const User = require('./models/user.js');
// doesn't work!
const users = User.find().byName('username');
console.log(users);

My user.js:

const mongoose = require('mongoose');

const userSchema = mongoose.Schema({

    loginId: String,
    firstname: String,
    lastname: String,
    eMail: String,
    password: String,
    active: Boolean

});
module.exports = mongoose.model("User", userSchema);

Update: Desired output: Array of users:

['bert', 'joe', 'john']

Array of users with passwords:

[ 'bert', 'bertpassword', 'joe', 'joespassword', 'john', 'johnspassword']

P.S Yes, this is a login system.


Dummy user entry:

{
    _id: "5dc16a477bfe45097018a074",
    loginId: "1",
    firstname: "Test",
    lastname: "Testeroni",
    eMail: "test@testeroni.test",
    password: "test",
    active: "true"
}

Solution

  • use Lodash flatten at the result

    npm i lodash --save
    

    then

    const mongoose = require("mongoose");
    const _ = require("lodash");
    
    const User = mongoose.model(
        "user",
        new mongoose.Schema({
            loginId: String,
            firstname: String,
            lastname: String,
            eMail: String,
            password: String,
            active: Boolean
          })
      );
    
    const db = mongoose.connection;
    
    mongoose.connect("mongodb://localhost:27017/dbName", {
      useNewUrlParser: true
    });
    
    db.once("open", () => {
      User.find({}, { firstname: 1, password: 1 }, function(err, users) {
        const flattenUsers = _(users)
          .map(({ firstname, password }) => [firstname, password])
          .flatten()
          .value();
        console.log(flattenUsers);
      });
    });