Mongo:将返回的记录限制为切片上的增量计数

时间:2016-10-19 18:29:30

标签: javascript node.js mongodb mongoose aggregation-framework

我在节点项目中使用mongoose,我有以下查询:

var query = Model.aggregate(
        { $match: { id: id } },
        { $sort: { created: -1 } },
        {
            $project: {
                name: true,
                number: true,
                created: true,
                status: true,
                time: true,
                array_data: { $slice: ['$array_data', 5] }
            }
        }
    )

我认为slice会根据array_data字段中的记录数量将我的整个记录​​限制为5,但它只会限制返回的array_data元素的数量。

我希望做的是:

让我们说我的模型中的记录1在array_data中有10个元素 我的模型中的记录2在array_data中有15个元素。

我希望能够切片或使用其他一些函数,所以当我用'limit'为20查询我的模型时,它返回第一个集合,其中包含array_data中的所有10个元素以及第二个集合及其前10个元素array_data中的记录等于20的“限制”。

Mongo可以实现这一切吗?

1 个答案:

答案 0 :(得分:1)

使用unwind解构文档,然后对其进行限制并再次对其进行分组

var query = Model.aggregate(
        { $match: { id: id } },
        { $sort: { created: -1 } },
        { $unwind: '$array_data' },
        { $limit: 20 },
        {
          $group: {
            _id: {
              name:'$name',
              number: '$number',
              created: '$created',
              status: '$status',
              time: '$time'
            },
            array_data: {
              $push: '$array_data'
            }
          }
        },
        {
            $project: {
                name: '$_id.name',
                number: '$_id.number',
                created: '$_id.created',
                status: '$_id.status',
                time: '$_id.time',
                array_data: 1,
                _id: 0
            }
        }
    )