Mongoose: Obtenez la liste complète des utilisateurs

99

J'ai essayé d'utiliser Mongoose pour envoyer la liste de tous les utilisateurs comme suit:

server.get('/usersList', function(req, res) {
    var users = {};

    User.find({}, function (err, user) {
        users[user._id] = user;
    });

    res.send(users);
});

Bien sûr, res.send(users);va envoyer {}, ce qui n'est pas ce que je veux. Existe-t-il une findalternative avec une sémantique légèrement différente, où je pourrais faire ce qui suit?

server.get('/usersList', function(req, res) {    
    User.find({}, function (err, users) {
        res.send(users);
    });
});

Essentiellement, je souhaite que le rappel ne soit exécuté que lorsque tous les utilisateurs ont été extraits de la base de données.

Randomblue
la source
comment y accéder dans la vue?
Saani

Réponses:

173

Eh bien, si vous voulez vraiment renvoyer un mappage de _idà user, vous pouvez toujours faire:

server.get('/usersList', function(req, res) {
  User.find({}, function(err, users) {
    var userMap = {};

    users.forEach(function(user) {
      userMap[user._id] = user;
    });

    res.send(userMap);  
  });
});

find() renvoie tous les documents correspondants dans un tableau, donc votre dernier code extrait envoie ce tableau au client.

soulcheck
la source
comment y accéder dans la vue?
Saani
13

Si vous souhaitez envoyer les données à une vue, transmettez ce qui suit.

    server.get('/usersList', function(req, res) {
        User.find({}, function(err, users) {
           res.render('/usersList', {users: users});
        });
    });

Dans votre vue, vous pouvez parcourir les données en utilisant les utilisateurs variables

histoire
la source
9

Ceci est juste une amélioration de la réponse de @soulcheck, et correction de la faute de frappe dans forEach (crochet fermant manquant);

    server.get('/usersList', (req, res) => 
        User.find({}, (err, users) => 
            res.send(users.reduce((userMap, item) => {
                userMap[item.id] = item
                return userMap
            }, {}));
        );
    );

à votre santé!

Evan P
la source
comment y accéder dans la vue?
Saani
1
Explique? Qu'est-ce que tu veux faire?
Evan P
@Saani lorsque vous accédez à la /userListroute, vous recevrez un objet JSON au format:{"123451": {...user 123451}, "123452": {...user 123452} }
Maxwell sc
8

Il y avait un moyen très simple de lister vos données:

server.get('/userlist' , function (req , res) {
 User.find({}).then(function (users) {
 res.send(users);
 });
});
Yasin
la source
3

La même chose peut être faite avec l'attente asynchrone et la fonction de flèche

server.get('/usersList', async (req, res) => {

const users = await User.find({});

const userMap = {};
users.forEach((user) => {
    userMap[user._id] = user;
});

res.send(userMap);

});
vithu shaji
la source
1

Au cas où nous voudrions list all documents in Mongoose collectionaprès updateoudelete

Nous pouvons modifier la fonction en quelque chose comme ceci:

exports.product_update = function (req, res, next) {
        Product.findByIdAndUpdate(req.params.id, {$set: req.body}, function (err, product) {
            if (err) return next(err);
            Product.find({}).then(function (products) {
                res.send(products);
                });
            //res.send('Product udpated.');
        });
    };

Ce sera list all documentssur le succès au lieu de justeshowing success message

Abdallah Okasha
la source
1

Pour rendre la fonction d'attendre que la liste soit récupérée.

getArrayOfData() {
    return DataModel.find({}).then(function (storedDataArray) {
        return storedDataArray;
    }).catch(function(err){
        if (err) {
            throw new Error(err.message);
        }
    });
}
gprathour
la source
0

Ma solution

User.find()
        .exec()
        .then(users => {
            const response = {
                count: users.length,
                users: users.map(user => {

                    return {
                        _id: user._id,
                        // other property
                    }

                })

            };
            res.status(200).json(response);
        }).catch(err => {
        console.log(err);
        res.status(500).json({
            success: false
        })
    })
kzncrda
la source