如何排序然后限制猫鼬中的结果数组?

时间:2019-01-14 01:18:15

标签: node.js mongodb mongoose

我有一个用户集合,其中包含每个用户的大量属性。一个属性是一个数组(“ guestlist_submitted”),我试图根据日期字段返回该数组中的最新3个项目。

使用猫鼬,我可以在用户对象上定位该特定属性,但似乎无法对其进行限制或排序。

我尝试使用切片和日期计算来返回最近的3个整数,但是我一直在努力使它正确,并且不确定什么地方出错了。

我尝试在查询构建器上使用排序/限制,但是我了解到,尽管我在查询构建器中说了“ select('guestlist_submitted')”,但这些不适用于我所针对的属性内的数组。

当我只针对用户对象的属性返回结果时,它以一个数组的形式出现,该数组内部有一个对象,而该对象内部有另一个数组。我在遍历它以定位内部数组以使用切片和日期排序时遇到问题。

第一次尝试

    Users.
    find({ fbid: req.query.fbid}).
    select('guestlist_submitted -_id').
    sort({"guestlist_submitted.date": 'desc'}).
    limit(3).
    exec((err, result) => {
        if (err) throw (err));
        if (result) {

            res.send(result);

        }

第二次尝试:

    Users.
    find({ fbid: req.query.fbid}).
    select('guestlist_submitted -_id').
    exec((err, result) => {
        if (err) res.send(JSON.stringify(err));
        if (result) {

            const slicedArr = result.guestlist_submitted.slice(0,1);

            const sortedResultArr = slicedArr.sort(function(a,b){return new Date(b.date) - new Date(a.date); });

            const newResultArr = sortedResultArr.slice(0, 2);

            res.send(newResultArr);

        }

我能得到的最好结果是“ guestlist_submitted”和整个数组(未排序),并将其放在数组中的对象内部。

我希望输出结果是可以在客户端上显示的新数组中guestlist_submitted数组的3个最新结果。

预先感谢您的帮助

编辑-解决方案

我最终想出了如何使用aggregate()来获得想要的东西

Users.aggregate([

    {
        $match:  {fbid: req.query.fbid}
    },
    {
        $unwind: "$guestlist_submitted"
    },
    {
        $sort: {'guestlist_submitted.date': -1}
    },
    {
        $limit: 2
    },
    {
        $group: {_id: '$_id', guestlist_submitted: {$push: '$guestlist_submitted'}}

    },
    {
        $project: { guestlist_submitted: 1, _id: 0 }

    }


]).exec((err, result) => {
    if (err) res.send(JSON.stringify(err));
    if (result) {

        console.log(result);
        res.send(result);
    }

}); 

1 个答案:

答案 0 :(得分:0)

我最终想出了如何使用aggregate()来获得想要的东西

Users.aggregate([

    {
        $match:  {fbid: req.query.fbid}
    },
    {
        $unwind: "$guestlist_submitted"
    },
    {
        $sort: {'guestlist_submitted.date': -1}
    },
    {
        $limit: 2
    },
    {
        $group: {_id: '$_id', guestlist_submitted: {$push: '$guestlist_submitted'}}

    },
    {
        $project: { guestlist_submitted: 1, _id: 0 }

    }


]).exec((err, result) => {
    if (err) res.send(JSON.stringify(err));
    if (result) {

        console.log(result);
        res.send(result);
    }

});