Mongoose: Dapatkan daftar lengkap pengguna


102

Saya telah mencoba menggunakan Mongoose untuk mengirim daftar semua pengguna sebagai berikut:

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

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

    res.send(users);
});

Tentu saja, res.send(users);akan mengirim {}, yang bukan itu yang saya inginkan. Apakah ada findalternatif dengan semantik yang sedikit berbeda, di mana saya dapat melakukan hal berikut?

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

Pada dasarnya, saya ingin callback dijalankan hanya jika semua pengguna telah diambil dari database.


bagaimana cara mengaksesnya dalam tampilan?
Saani

Jawaban:


177

Nah, jika Anda benar-benar ingin mengembalikan pemetaan dari _idke user, Anda selalu dapat melakukan:

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() mengembalikan semua dokumen yang cocok dalam satu larik, sehingga kode terakhir Anda yang dipotong mengirimkan larik itu ke klien.


bagaimana cara mengaksesnya dalam tampilan?
Saani

13

Jika Anda ingin mengirim data ke tampilan, teruskan berikut ini.

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

Di dalam tampilan Anda, Anda dapat memutar melalui data menggunakan variabel pengguna


9

Ini hanyalah Peningkatan dari jawaban @soulcheck, dan perbaikan kesalahan ketik di forEach (kurung tutup tidak ada);

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

Bersulang!


bagaimana cara mengaksesnya dalam tampilan?
Saani

1
menjelaskan? Apa yang ingin kamu lakukan?
Evan P

@Saani ketika Anda mengakses /userListrute Anda akan menerima objek JSON dengan format:{"123451": {...user 123451}, "123452": {...user 123452} }
Maxwell sc

8

Ada cara yang sangat mudah untuk membuat daftar data Anda:

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

4

Hal yang sama dapat dilakukan dengan fungsi async await dan panah

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

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

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

res.send(userMap);

});

1

Jika kita ingin list all documents in Mongoose collectionsetelah updateataudelete

Kita bisa mengedit fungsinya menjadi seperti ini:

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

Ini akan list all documentsberhasil, bukan hanyashowing success message


1

Untuk membuat fungsi menunggu daftar diambil.

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

0

Solusi Saya

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
        })
    })
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.