【问题标题】:MongoDB Node Driver Count of current aggregation当前聚合的 MongoDB Node Driver Count
【发布时间】:2022-02-05 13:45:11
【问题描述】:

我正在将 mongodb 用于节点,并尝试根据一些设置的过滤器聚合文档集合,然后将其限制为 10。我将它聚合得很好,限制得很好,但我需要得到总数在将文档限制为 10 个之前汇总文档。

这是我的代码。

var qry = [];
if (filter.FocusArea && filter.FocusArea != "(None)") {
    qry.push({
        $match: { 'ProgramAreaId': filter.FocusArea }
    });
}
if (filter.Status && filter.Status != "(None)") {
    qry.push({
        $match: { 'StatusId': filter.Status }
    });
}
if (filter.ProgOfficer && filter.ProgOfficer != "(None)") {
    qry.push({
        $match: { 'ProgramOfficerId': filter.ProgOfficer }
    });
}
if (filter.Fund && filter.Fund != "(None)") {
    qry.push({
        $match: { 'FundId': filter.Fund }
    });
}

var skipNbr = (parseInt(filter.Page) * 10 - 10);
qry.push({ $project: { _id: '$_id', count: { $sum: '$$ROOT' }, content: '$$ROOT'} }) // I would like to do the count here.
qry.push({ $skip: skipNbr })
qry.push({ $limit: 10 })
var apps = mongo.collection('Applications').aggregate(qry, function(err, docs) {
    callback(docs);
});

这可以在一个聚合查询中完成还是需要分成两个?

【问题讨论】:

    标签: javascript node.js mongodb aggregation-framework


    【解决方案1】:

    可以在单个查询中执行此操作。

    您可以使用$project 将过滤后的数组投影到两个不同的字段中:一个带有内容,一个带有计数。

    您可以使用$slice 来限制内容数组。

     db.collection.aggregate([
        {
            $match: {} // Filter
        },
        {
            $group: {
                _id: 1,
                array: {$push: '$$ROOT'}
            }
        },
        {
            $project: {
                content: {
                    $slice: ['$array', skip, limit]
                },
                total: {
                    $size: '$array'
                }
            }
        }
    ], {allowDiskUse: true})
    

    【讨论】:

    • $array 是一个 mongo 属性还是你说用什么来代替它?
    • 这是您收藏中的项目数组。查看更新后的答案。
    • 我想你可能误解了这个问题。我试图在汇总后但在限制之前对我的集合中的所有文档进行计数。我不是在处理文档中的嵌套数组。
    • 这正是我在那里所做的。我正在使用 $group 将过滤后的集合转换为单个数组对象。 $size 将在限制之前为您提供整个过滤集合的大小。 $slice 用于使用 skip 和 limit 参数进行限制。
    • 您可以用我的回答中的 $group 和 $project 替换这些行: qry.push({ $project: { _id: '$_id', count: { $sum: '$$ROOT' }, content: '$$ROOT'} }) // 我想在这里进行计数。 qry.push({ $skip: skipNbr }) qry.push({ $limit: 10 })
    猜你喜欢
    • 2021-04-28
    • 2019-02-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 2019-10-14
    • 2022-01-20
    • 2020-01-25
    • 2020-01-28
    相关资源
    最近更新 更多