Mongoose: obtenha a lista completa de usuários


97

Tentei usar o Mongoose para enviar a lista de todos os usuários da seguinte maneira:

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

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

    res.send(users);
});

Claro, res.send(users);vai mandar {}, que não é o que eu quero. Existe uma findalternativa com semântica ligeiramente diferente, onde eu poderia fazer o seguinte?

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

Essencialmente, quero que o retorno de chamada seja executado apenas quando todos os usuários forem buscados no banco de dados.


como acessar na view?
Saani

Respostas:


170

Bem, se você realmente deseja retornar um mapeamento de _idpara user, você sempre pode fazer:

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() retorna todos os documentos correspondentes em uma matriz, de modo que seu último código cortado envia essa matriz ao cliente.


como acessar na view?
Saani

12

Se você deseja enviar os dados para uma visualização, passe o seguinte.

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

Dentro de sua visão, você pode percorrer os dados usando a variável users


9

Este é apenas um aprimoramento da resposta de @soulcheck e correção do erro de digitação em forEach (colchete de fechamento ausente);

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

Felicidades!


como acessar na view?
Saani

1
explicar? O que você quer fazer?
Evan P

@Saani ao acessar a /userListrota receberá um objeto JSON com o formato:{"123451": {...user 123451}, "123452": {...user 123452} }
Maxwell sc

8

Essa era uma maneira muito fácil de listar seus dados:

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

3

O mesmo pode ser feito com espera assíncrona e função de seta

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

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

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

res.send(userMap);

});

1

Caso queiramos list all documents in Mongoose collectiondepois updateoudelete

Podemos editar a função para algo assim:

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.');
        });
    };

Isso terá list all documentssucesso em vez de apenasshowing success message


1

Para fazer a função esperar a lista ser buscada.

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

0

Minha Solução

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
        })
    })
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.