Самый простой способ загрузить документы из коллекции MongoDB кусками по 10 - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу создать приложение, которое создает заказы, а затем загружает их в список. Проблема в том, что я не могу загрузить все заказы одновременно. Я хочу загрузить их 10 на 10.

Однако, это выглядит очень сложно сделать в MongoDB, так как здесь нет автоматического c идентификатора, как в SQL. Я знаю, как имитировать автоматический c идентификатор, но я думаю, что эту функцию проще реализовать.

Итак, учитывая коллекцию MongoDB, как мне загружать документы 10 на 10, начиная с последней один до начала?

1 Ответ

2 голосов
/ 04 февраля 2020

Вам нужно отсортировать документ по полю, а затем использовать skip & limit aggregation. Также для получения общего количества записей мы можем использовать фасет агрегирование.

Вот подробное объяснение:

Допустим, у вас есть эти 8 документов в коллекции заказов.

[
    {
        "_id": "5e390fc33285e463a0799689",
        "customer": "Max",
        "total": 10,
        "orderDate": "2020-02-04T06:31:31.311Z",
        "__v": 0
    },
    {
        "_id": "5e390fd03285e463a079968a",
        "customer": "John",
        "total": 9.2,
        "orderDate": "2020-02-04T06:31:44.190Z",
        "__v": 0
    },
    {
        "_id": "5e390fda3285e463a079968b",
        "customer": "Smith",
        "total": 11.3,
        "orderDate": "2020-02-04T06:31:54.248Z",
        "__v": 0
    },
    {
        "_id": "5e390fdf3285e463a079968c",
        "customer": "Smith",
        "total": 12.3,
        "orderDate": "2020-02-04T06:31:59.993Z",
        "__v": 0
    },
    {
        "_id": "5e390fec3285e463a079968d",
        "customer": "Jimmy",
        "total": 15.6,
        "orderDate": "2020-02-04T06:32:12.336Z",
        "__v": 0
    },
    {
        "_id": "5e390ffd3285e463a079968e",
        "customer": "Wesley",
        "total": 11,
        "orderDate": "2020-02-04T06:32:29.670Z",
        "__v": 0
    },
    {
        "_id": "5e3910163285e463a079968f",
        "customer": "Adam",
        "total": 6.1,
        "orderDate": "2020-02-04T06:32:54.131Z",
        "__v": 0
    },
    {
        "_id": "5e3910213285e463a0799690",
        "customer": "Michael",
        "total": 7.2,
        "orderDate": "2020-02-04T06:33:05.166Z",
        "__v": 0
    }
]

Если мы хотим получить эти документы в виде кусков, мы можем написать пример маршрута следующим образом:

router.get("/orders", async (req, res) => {
  const page = req.query.pageIndex ? +req.query.pageIndex : 1;
  const limit = req.query.pageSize ? +req.query.pageSize : 10;
  const skip = (page - 1) * limit;

  const result = await Order.aggregate([
    {
      $sort: {
        orderDate: -1
      }
    },
    {
      $facet: {
        totalRecords: [{ $count: "total" }],
        data: [{ $skip: skip }, { $limit: limit }]
      }
    }
  ]);
  res.send(result);
});

Мы отправляем параметры pageIndex и pageSize в строке запроса следующим образом http://...../orders?pageIndex=1&pageSize=3

Когда мы используем pageIndex=1 и pageSize=3, результат будет таким: (как вы видите, мы также возвращаем общее количество записей, чтобы клиент мог построить числа нумерации страниц)

[
    {
        "totalRecords": [
            {
                "total": 8
            }
        ],
        "data": [
            {
                "_id": "5e3910213285e463a0799690",
                "customer": "Michael",
                "total": 7.2,
                "orderDate": "2020-02-04T06:33:05.166Z",
                "__v": 0
            },
            {
                "_id": "5e3910163285e463a079968f",
                "customer": "Adam",
                "total": 6.1,
                "orderDate": "2020-02-04T06:32:54.131Z",
                "__v": 0
            },
            {
                "_id": "5e390ffd3285e463a079968e",
                "customer": "Wesley",
                "total": 11,
                "orderDate": "2020-02-04T06:32:29.670Z",
                "__v": 0
            }
        ]
    }
]

Когда мы используем pageIndex=2 и pageSize=3, результат будет таким:

[
    {
        "totalRecords": [
            {
                "total": 8
            }
        ],
        "data": [
            {
                "_id": "5e390fec3285e463a079968d",
                "customer": "Jimmy",
                "total": 15.6,
                "orderDate": "2020-02-04T06:32:12.336Z",
                "__v": 0
            },
            {
                "_id": "5e390fdf3285e463a079968c",
                "customer": "Smith",
                "total": 12.3,
                "orderDate": "2020-02-04T06:31:59.993Z",
                "__v": 0
            },
            {
                "_id": "5e390fda3285e463a079968b",
                "customer": "Smith",
                "total": 11.3,
                "orderDate": "2020-02-04T06:31:54.248Z",
                "__v": 0
            }
        ]
    }
]

Когда мы используем pageIndex=3 и pageSize=3, результат будет таким:

[
    {
        "totalRecords": [
            {
                "total": 8
            }
        ],
        "data": [
            {
                "_id": "5e390fd03285e463a079968a",
                "customer": "John",
                "total": 9.2,
                "orderDate": "2020-02-04T06:31:44.190Z",
                "__v": 0
            },
            {
                "_id": "5e390fc33285e463a0799689",
                "customer": "Max",
                "total": 10,
                "orderDate": "2020-02-04T06:31:31.311Z",
                "__v": 0
            }
        ]
    }
]

В вашем случае вам необходимо отправить 10 в качестве значения pageSize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...