mongodb - MongoDB在聚合查询中分页
问题描述
我在 MongoDB 中有以下集合
配置文件集合
> db.Profile.find()
{ "_id" : ObjectId("5ec62ccb8897af3841a46d46"), "u" : "Test User", "is_del": false }
店铺收藏
> db.Store.find()
{ "_id" : ObjectId("5eaa939aa709c30ff4703ffd"), "id" : "5ec62ccb8897af3841a46d46", "a" : { "ci": "Test City", "st": "Test State" }, "ip" : false }, "op" : [ ], "b" : [ "normal" ], "is_del": false}
物品收藏
> db.Item.find()
{ "_id" : ObjectId("5ea98a25f1246b53a46b9e10"), "sid" : "5eaa939aa709c30ff4703ffd", "n" : "sample", "is_del": false}
这些集合之间的关系定义如下:
Profile -> Store
: 是1:n
关系。id
in的字段Store
与in 的_id
字段相关Profile
。Store
->Item
:这也是1:n
关系。sid
in的字段Item
与in 的_id
字段相关Store
。
我有一个查询来查找所有配置文件商店以及Item
每个商店的数量。查询如下(我从答案中得到)
db.Profile.aggregate([
{
$match: { is_del: false }
},
{
$lookup: {
from: "Store",
as: "stores",
let: {
pid: { $toString: "$_id" }
},
pipeline: [
{
$match: {
is_del: false,
$expr: { $eq: ["$$pid", "$id"] }
}
},
{
$lookup: {
from: "Item",
as: "items",
let: {
sid: { $toString: "$_id" }
},
pipeline: [
{
$match: {
is_del: false,
$expr: { $eq: ["$$sid", "$sid"] }
}
},
{
$count: "count"
}
]
}
},
{
$unwind: "$items"
}
]
}
}
])
现在,我需要对结果进行分页。如何在汇总结果中分页?什么是可扩展的方法?
解决方案
我相信你必须添加
{
$limit: limit
}, {
$skip: skip
}
后
{
$unwind: "$items"
}
基本上,在您希望将查询限制到的查询级别上,假设 10 个元素,但先跳过 5 个元素(您加载第二页的记录,每页 5 个记录)。我相信你每次limit
都必须计算。skip
推荐阅读
- tensorflow - 从模型中获取张量时出错:变量 batch_normalization_1_3/moving_mean/biased 已经存在,不允许
- excel - 在 Excel 中,限制单元格范围内的字符总数(如 1000 个)
- puppeteer - 如何找到与 Puppeteer 的 `chromium_revision` 匹配的 Chromium 源代码?
- node.js - 在 express js 中存储会话数据的最佳选择是什么
- git - 有没有一种快速的方法来制作虚拟文件并 git commit 它们来模拟工作?
- postgresql - 为什么“子查询用作表达式”允许返回 SETOF 的东西而不是 TABLE?
- python - Python 3.6 舍入为 0.0
- python - 将生成器转换为列表会覆盖 Python 中的值
- amazon-web-services - 我构建了我的 MVP 的前端。现在,我接下来要做什么?
- php - Wordpress:wpdb 有条件地准备