我试图将两个嵌套数组(使用$ concatArrays)连接到一个新字段中。我想通过两组对象中都存在的属性对连接(Model.timeline)的输出进行排序。我似乎无法使其与$ unwind一起使用。这是没有任何排序的查询:
Model.aggregate([
{
$match: {
'id': id
}
},
{
$project: {
id: 1,
name: 1,
flagged: 1,
updatedAt: 1,
lastEvent: {
$arrayElemAt: ['$events', -1]
},
lastimage: {
$arrayElemAt: ['$images', -1]
},
timeline: {
$concatArrays: [
{ $filter: {
input: '$events',
as: 'event',
cond: { $and: [
{ $gte: ['$$event.timestamp', startAt] },
{ $lte: ['$$event.timestamp', endAt] }
]}
}},
{ $filter: {
input: '$images',
as: 'image',
cond: { $and: [
{ $gte: ['$$image.timestamp', startAt] },
{ $lte: ['$$image.timestamp', endAt] }
]}
}}
]
}
}
}
]);
我是否缺少明显的东西?
最佳答案
比赛和项目完成后,您需要三个流水线阶段。首先是$unwind
,然后是$sort
,然后是$group
。使用$first
运算符保留所有字段。
{
$undwind : "$timeline",
},
{
$sort : {"your.sortable.field" : 1}
},
{
$group : {
_id : "$_id",
name : {$first : 1},
flagged : {$first : 1},
updatedAt : {$first : 1},
lastEvent : {$first : 1},
lastimage : {$first : 1},
timeline : {$push : "$timeline"}
}
}
请注意,即使在匹配阶段之后有多个文档,此功能也将起作用。因此,基本上,这将对每个文档中的数组元素进行排序。
关于node.js - $ concatArrays上的MongoDB $ sort,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41875215/