我试图将两个嵌套数组(使用$ 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/

10-11 10:22