【问题标题】:How can I sort then limit an array of results in mongoose?如何排序然后限制猫鼬中的结果数组?
【发布时间】:2019-01-20 04:11:30
【问题描述】:

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

使用 Mongoose,我可以针对用户对象上的特定属性,但我似乎无法限制或排序它们。

我尝试使用切片和日期计算来返回最近的 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);
    }

}); 

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我最终弄清楚了如何使用 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);
        }
    
    }); 
    

    【讨论】:

    • 救命稻草! :D 我想知道这是否可能,或者我需要自己对数组进行排序。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多