【发布时间】:2020-09-15 14:50:39
【问题描述】:
我有一组文档,每个文档都有一个 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 个项目具有相同的 groupid,但它们的大小不同。我只需要从组中检索一个,没有关系(在这种情况下,它是大小)。
我可以这样做:
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
})
我将最后一个 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 类似的问题,有些需要在 $group 之前和之后使用 $sort ,但这对我不起作用。我真的不知道如何根据文档 _id 正确地对它们进行排序。
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework