我在节点项目中使用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可以实现这一切吗?
答案 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
}
}
)