gpt4 book ai didi

javascript - 检索包含与查询匹配的文档子集和匹配总数的文档

转载 作者:行者123 更新时间:2023-12-02 17:14:40 25 4
gpt4 key购买 nike

如何查询集合以检索与查询匹配的有限数量的文档以及同时与所述查询匹配的文档数量。

我正在寻找这样的结果:

{
result : [
{
_id:null,
total:734, //there are 734 documents matching the query
page:[ //limited to 3
{_id:"...", someValue:30000}
{_id:"...", someValue:30400}
{_id:"...", someValue:31900}
]
}
]
}

我正在尝试将此用于分页目的。

最佳答案

为了进一步解释,您似乎正在尝试做的是使用聚合框架实现带有总结果计数的“分页”。这不是一个好主意,所以我将向您展示原因:

db.collection.aggregate([
// Some query to match results
{ "$match": { /* some query */ } },

// Then group to get the count -- OOPS!
{ "$group": {
"_id": null,
"page": { "$push": /* the documents */ }, // essentially the problem
"total": { "$sum": 1 }
}},

// Then unwind -- oh dear!
{ "$unwind": "$page" },

// Then skip and limit
{ "$skip": 100 },
{ "$limit": 25 }

// And group back again :-<
{ "$group": {
"_id": null,
"total": { "$first": "$total" },
"page": { "$push": "$page" }
}}
])

除了所有管道处理之外,真正可怕的事情是您将每个结果“推”到数组中。您必须这样做才能获得总数。

然后,聚合框架中的数组也没有真正的“切片”概念。你需要做的就是坚持 $skip$limit管道阶段以获得结果的“当前页面”。

没有其他方法可以做到这一点,当然,除了认识到聚合框架本身不是用于此目的的工具之外。您想要执行一个查询来计算总结果,并执行另一个查询来计算当前结果页。这正是我们多年来对 SQL 数据库的做法。

使用 mongoose 时需要注意一些事项:

// Avoiding the indentation creep

var queryDoc = {};
async.waterfall(
[
function(callback) {
Model.count(queryDoc,function(err,count) {
callback(err,count);
}
},
function(count,callback) {
var query = Model.find(queryDoc);
query.skip(100).limit(25).exec(function(err,page) {
callback(err,{ "total": count, "page": page });
});
}
],
function(err, result) {
if (err) throw err; // or handle
console.log( result ); // or res.send or whatever
}
);

理想情况下,您确实应该查看范围查询,而不是使用“跳过”和“限制”,或者通常只是查找最后一个“看到的”值“大于”仅向前分页。

如果您必须对查询结果使用聚合框架,那么没问题,但请以相同的方式进行。尝试获取总计数然后“分页”出结果是非常可怕的。

关于javascript - 检索包含与查询匹配的文档子集和匹配总数的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24544595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com