MongoDB Aggregate没有正确排序

时间:2014-04-21 18:25:20

标签: mongodb sorting

我有以下查询可以正常工作。但是,向聚合管道添加排序实际上并不对其进行排序。它确实改变了结果的顺序,但没有正确排序。

知道为什么拒绝按日期对结果进行排序?

db.calls.aggregate({
    $match: {
        '_id.date': {
            $gte: ISODate('2014-04-13T00:00:00.000Z'),
            $lte: ISODate('2014-04-20T00:00:00.000Z')
        }
    }
}, {
    $project: {
        calls: 1,
        year: {
            $year: '$_id.date'
        },
        month: {
            $month: '$_id.date'
        },
        day: {
            $dayOfMonth: '$_id.date'
        }
    }
}, {
    $group: {
        _id: {
            name: "$_id.name",
            day: '$day',
            year: '$year',
            month: '$month'
        },
        date: {
            '$first': '$_id.date'
        },
        calls: {
            '$sum': '$calls'
        }
    }
}, {
    $group: {
        _id: '$_id.name',
        records: {
            $addToSet: {
                date: '$date',
                calls: '$calls'
            }
        }
    }
}, {
    $sort: {
        'records.date': 1
    }
})

输出:

/* 0 */
{
    "result" : [ 
        {
            "_id" : "a",
            "records" : [ 
                {
                    "date" : ISODate("2014-04-13T00:00:00.000Z"),
                    "calls" : 522
                }, 
                {
                    "date" : ISODate("2014-04-16T00:00:00.000Z"),
                    "calls" : 1523
                }, 
                {
                    "date" : ISODate("2014-04-20T00:00:00.000Z"),
                    "calls" : 57
                }, 
                {
                    "date" : ISODate("2014-04-14T00:00:00.000Z"),
                    "calls" : 1540
                }, 
                {
                    "date" : ISODate("2014-04-15T00:00:00.000Z"),
                    "calls" : 1592
                }, 
                {
                    "date" : ISODate("2014-04-17T00:00:00.000Z"),
                    "calls" : 1466
                }, 
                {
                    "date" : ISODate("2014-04-18T00:00:00.000Z"),
                    "calls" : 1003
                }, 
                {
                    "date" : ISODate("2014-04-19T00:00:00.000Z"),
                    "calls" : 623
                }
            ]
        }, 
        {
            "_id" : "b",
            "records" : [ 
                {
                    "date" : ISODate("2014-04-15T00:00:00.000Z"),
                    "calls" : 102
                }, 
                {
                    "date" : ISODate("2014-04-17T00:00:00.000Z"),
                    "calls" : 97
                }, 
                {
                    "date" : ISODate("2014-04-16T00:00:00.000Z"),
                    "calls" : 116
                }, 
                {
                    "date" : ISODate("2014-04-13T00:00:00.000Z"),
                    "calls" : 118
                }, 
                {
                    "date" : ISODate("2014-04-14T00:00:00.000Z"),
                    "calls" : 142
                }, 
                {
                    "date" : ISODate("2014-04-19T00:00:00.000Z"),
                    "calls" : 68
                }, 
                {
                    "date" : ISODate("2014-04-18T00:00:00.000Z"),
                    "calls" : 100
                }, 
                {
                    "date" : ISODate("2014-04-20T00:00:00.000Z"),
                    "calls" : 6
                }
            ]
        }, 
        {
            "_id" : "c",
            "records" : [ 
                {
                    "date" : ISODate("2014-04-17T00:00:00.000Z"),
                    "calls" : 137130
                }, 
                {
                    "date" : ISODate("2014-04-14T00:00:00.000Z"),
                    "calls" : 139497
                }, 
                {
                    "date" : ISODate("2014-04-13T00:00:00.000Z"),
                    "calls" : 92166
                }, 
                {
                    "date" : ISODate("2014-04-18T00:00:00.000Z"),
                    "calls" : 123129
                }, 
                {
                    "date" : ISODate("2014-04-15T00:00:00.000Z"),
                    "calls" : 146390
                }, 
                {
                    "date" : ISODate("2014-04-20T00:00:00.000Z"),
                    "calls" : 4515
                }, 
                {
                    "date" : ISODate("2014-04-16T00:00:00.000Z"),
                    "calls" : 141792
                }, 
                {
                    "date" : ISODate("2014-04-19T00:00:00.000Z"),
                    "calls" : 104847
                }
            ]
        }
    ],
    "ok" : 1
}

文件结构:

{
    "_id" : {
        "date" : ISODate("2014-04-08T12:00:00.000Z"),
        "name" : "a"
    },
    "calls" : 515
}

通过在最后一个组之前执行$ sort并使用$ push切换$ addToSet来修复订单。

db.calls.aggregate({
    $match: {
        '_id.date': {
            $gte: ISODate('2014-04-13T00:00:00.000Z'),
            $lte: ISODate('2014-04-20T00:00:00.000Z')
        }
    }
}, {
    $project: {
        calls: 1,
        year: {
            $year: '$_id.date'
        },
        month: {
            $month: '$_id.date'
        },
        day: {
            $dayOfMonth: '$_id.date'
        }
    }
}, {
    $group: {
        _id: {
            name: "$_id.name",
            day: '$day',
            year: '$year',
            month: '$month'
        },
        date: {
            '$first': '$_id.date'
        },
        calls: {
            '$sum': '$calls'
        }
    }
}, {
        $sort: {
            date: 1
        }
    }, {
        $group: {
            _id: '$_id.name',
            records: {
                $push: {
                    date: '$date',
                    calls: '$calls'
                }
            }
        }
    })

0 个答案:

没有答案