У меня есть набор документов, у каждого из которых есть 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 документа.