MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak zliczyć wszystkie dokumenty w kolekcji i użyć cd w kontrolerze, z MongoDB i Express.js?

Można to zrobić łatwiej dzięki frameworkowi agregacji mongodb.

Używamy $facet agregacja, aby uzyskać dane podzielone na strony wraz z całkowitą liczbą dokumentów.

W ramach agregacji używamy $lookup zamiast zaludniać mangusty. $lookup zwraca tablicę, aby pobrać pierwszy element tablicy używamy $ arrayElemAt operator wewnątrz $addFields .

Plac zabaw

A oto kod, który należy zastosować do Twojej aplikacji:(Pierwsza agregacja $match jest tutaj niepotrzebna, ale umieściłem ją na wypadek, gdyby była potrzebna w przyszłości)

exports.getPosts = async (req, res, next) => {
    const perPage = 5;
    const currPage = req.query.page ? parseInt(req.query.page) : 1;
    const skip = (currPage - 1) * perPage;

    try {
        const result = await Post.aggregate([{
                $match: {},
            },
            {
                $sort: {
                    created_at: -1,
                },
            },
            {
                $lookup: {
                    from: "categories",
                    localField: "category",
                    foreignField: "_id",
                    as: "category",
                },
            },
            {
                $addFields: {
                    category: {
                        $arrayElemAt: ["$category", 0],
                    },
                },
            },
            {
                $facet: {
                    totalRecords: [{
                        $count: "total",
                    }, ],
                    data: [{
                            $skip: skip,
                        },
                        {
                            $limit: perPage,
                        },
                    ],
                },
            },
        ]);

        let postsCount = result[0].totalRecords[0].total;
        const pageCount = Math.ceil(postsCount / perPage);
        const pageDecrement = currPage > 1 ? 1 : 0;
        const pageIncrement = currPage < pageCount ? 1 : 0;
        const posts = result[0].data;

        res.render("default/index", {
            moment: moment,
            layout: "default/layout",
            website_name: "MEAN Blog",
            page_heading: "XPress News",
            page_subheading: "A MEAN Stack Blogging Application",
            currPage,
            posts,
            pageDecrement,
            pageIncrement,
        });
    } catch (err) {
        console.log("Error: ", err);
        res.status(500).send("something went wrong");
    }
};

Przy okazji, w schemacie posta, dla pól daty użyj default: Date.now() , spowoduje to, że wartość daty będzie zawsze taka sama, powinna mieć następujący format:default: Date.now



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Utknąłem w ładowaniu z mangustą?

  2. Wiele zliczeń z jednym zapytaniem w mongodb

  3. MongoDB bind_ip nie będzie działać, jeśli nie zostanie ustawiony na 0.0.0.0

  4. Zagraj w konfigurację FakeApplication 2.0 z konfiguracją testową

  5. Node.js, Mongo znajduje i zwraca dane