Как разбивать страницы в MongoDB с помощью агрегата - PullRequest
0 голосов
/ 28 мая 2020

У меня есть набор документов, у каждого из которых есть groupID. Я могу получить только один документ из каждой группы, но я не уверен, как сделать эффективную разбивку на страницы. Пример:

{
     unitquantity: "2"
     itemcode: "842852100008"
     name: "Atlas Black"
     price: "39990"
     size: "s"
     groupid: "40bf6073-a1d3-4ffa-9ced-dd2f5fcd1b5e",
},
{
     unitquantity: "2"
     itemcode: "842852100382"
     name: "Atlas Black"
     price: "39990"
     size: "m"
     groupid: "40bf6073-a1d3-4ffa-9ced-dd2f5fcd1b5e",
},
{
     unitquantity: "2"
     itemcode: "842852100746"
     name: "Atlas Black"
     price: "39990"
     size: "xl"
     groupid: "40bf6073-a1d3-4ffa-9ced-dd2f5fcd1b5e",
},

Эти 3 элемента имеют одинаковый идентификатор группы, но различаются по размеру. Мне нужно получить только один из группы, без разницы (в данном случае это будет размер).

Я могу сделать это с помощью:

var query = {[`category.${type}`]: `${type}`}
var query = {[`category.${type}`]: `${type}`}
db.collection('products').aggregate([
     { $match: query },
     {
          $group: {
               _id: "$groupid",
               images: { $last: "$images" },
               description: { $last: "$description" },
               barcode: { $last: "$barcode" },
               category: { $last: "$category" },
               subcategory: { $last: "$subcategory" }, 
               id: { $last: "$_id" }
          }
     },
     { $sort: {'_id': -1} },
     { $limit: 30 }
]).toArray().then(result=>{
     lastKey = result[result.length - 1].id
     groupId = result[result.length - 1].groupid
})

Я сохраняю последний идентификатор группы в переменной. Когда я нажимаю кнопку «Загрузить», я хочу, чтобы появились следующие 30. Вот мой код загрузки, который в основном тот же самый, за исключением того, что запрос для $ match использует _id документа:

var query = {[`category.${type}`]: `${type}`, 'groupid': { $ne: `${groupId}`}, '_id': {$gt: lastKey}}
db.collection('products').aggregate([
     { $match: query },
     {
          $group: {
               _id: "$groupid",
               groupid: { $last: "$groupid" },
               images: { $last: "$images" },
               description: { $last: "$description" },
               barcode: { $last: "$barcode" },
               category: { $last: "$category" },
               subcategory: { $last: "$subcategory" }, 
               id: { $last: "$_id" }
          }
     },
     { $sort: {'_id': -1} },
     { $limit: 30 },
]).toArray().then(result => {
    lastKey = result[result.length - 1].id
    groupId = result[result.length - 1]._id
})

Однако я получаю много таких, которые повторяются. Я видел похожие проблемы, которые были у других с $ group и $ sort, а некоторым нужно было использовать $ sort до $ group и после, но это не работает для меня. Я действительно не знаю, как правильно их отсортировать на основе _id документа.

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете использовать $ skip для подсчета страниц. вам нужно управлять состоянием количества страниц в клиенте

 db.collection('products').aggregate([
  { $match: query },
  {
      $group: {
           _id: "$groupid",
           groupid: { $last: "$groupid" },
           images: { $last: "$images" },
           description: { $last: "$description" },
           barcode: { $last: "$barcode" },
           category: { $last: "$category" },
           subcategory: { $last: "$subcategory" }, 
           id: { $last: "$_id" }
      }
 },
  { $sort: {'_id': -1} },
  { $skip: 30 * page },
  { $limit: 30 },
]).toArray().then(result => {

 lastKey = result[result.length - 1].id
 groupId = result[result.length - 1]._id

})
...