$ concatArrays

时间:2017-01-26 14:03:21

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

我正在尝试将两个嵌套数组(使用$ 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] }
                        ]}
                    }}
                ]
            }
        }
    }
]);

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:0)

比赛和项目结束后,您需要三个管道阶段。先是$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"} } } 运算符保留所有字段。

npm install jquery --save
npm install jqueryui --save
npm install @types/jquery --save
npm install npm install @types/jqueryui --save

请注意,即使您在比赛阶段后有多个文档,这也会有效。所以基本上这将对每个文档中的数组元素进行排序。

答案 1 :(得分:0)

我将id替换为_id后,您的$ match和$ project聚合阶段工作,并填写idstartAtendAt的值像这样:

db.items.aggregate([
     {
        $match: {
            '_id': '58'
        }
    },
    {
        $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', ISODate("2016-01-19T20:15:31Z")] },
                            { $lte: ['$$event.timestamp', ISODate("2016-12-01T20:15:31Z")] }
                        ]}
                    }},
                    { $filter: {
                        input: '$images',
                        as: 'image',
                        cond: { $and: [
                            { $gte: ['$$image.timestamp', ISODate("2016-01-19T20:15:31Z")] },
                            { $lte: ['$$image.timestamp', ISODate("2016-12-01T20:15:31Z")] }
                        ]}
                    }}
                ]
            }
        }
    }
]);