虽然已解决,但还是想问一下,Nodejs中原生mongodb的findOne如何排序子数组?

虽然已解决,但还是想问一下,Nodejs中原生mongodb的findOne如何排序子数组?

例如有一段数据。

        var article = {
            title: '文章标题',
            comments: [
                {
                    content: '#3非常好',
                    time: '2014-6-14 11:25:05'
                },
                {
                    content: '#2非常非常好',
                    time: '2014-6-15 11:25:05'
                },
                {
                    content: '#非常非常好',
                    time: '2014-6-16 11:25:05'
                },
            ]
        }

通过 findOne 查询出来后, 评论是默认 #3,#2,#1排序的,有没有mongodb原生的排序方式,就像是 find中的$sort呢?


4 回复

Node.js 中原生 MongoDB 的 findOne 如何排序子数组

背景信息

假设你有一个包含评论的文章对象,这些评论需要按时间排序。你希望在使用 findOne 查询时能够直接对嵌套的评论数组进行排序。

示例代码

为了实现这一点,我们可以使用 MongoDB 的聚合框架(Aggregation Framework)。虽然 findOne 本身不支持直接对子数组进行排序,但我们可以通过聚合管道来实现这一需求。

const MongoClient = require('mongodb').MongoClient;

// 连接数据库
MongoClient.connect('mongodb://localhost:27017/yourDatabase', { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
    if (err) throw err;
    const db = client.db();
    
    // 使用聚合查询来对评论进行排序
    db.collection('articles').aggregate([
        { $match: { title: '文章标题' } },
        { $unwind: '$comments' },
        { $sort: { 'comments.time': -1 } },
        { $group: {
            _id: '$_id',
            title: { $first: '$title' },
            comments: { $push: '$comments' }
        }}
    ]).toArray((err, result) => {
        if (err) throw err;
        
        console.log(result);
        client.close();
    });
});

解释

  1. $match: 首先筛选出标题为 '文章标题' 的文档。
  2. $unwind: 将 comments 数组展开成多个文档,每个文档包含一个评论。
  3. $sort: 按照 comments.time 字段降序排列评论。
  4. $group: 将处理后的评论重新组合成原始格式,同时保留文档的其他字段(如 title)。

通过这种方式,我们可以在 findOne 类似的操作中实现对子数组的排序。尽管这不是直接使用 findOne,但这是在 Node.js 中使用 MongoDB 原生 API 实现所需功能的一种有效方法。


交给前端处理吧:)

如果這是個評論數組的話,建議不要用數組排序查找(性能不好)。 說你插入的時候按順序插入不就好咯

在Node.js中使用原生MongoDB驱动程序进行查询时,findOne 方法本身并不直接支持对嵌套数组中的元素进行排序。不过,你可以先使用 aggregate 方法对数组进行排序,然后再使用 findOne 获取结果。

以下是一个示例代码,展示如何对嵌套数组 comments 中的元素进行排序:

const MongoClient = require('mongodb').MongoClient;

async function sortComments() {
    const uri = "your_mongodb_connection_string";
    const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

    try {
        await client.connect();
        const database = client.db("your_database_name");
        const collection = database.collection("articles");

        // 使用 aggregate 方法对 comments 数组进行排序
        const result = await collection.aggregate([
            {
                $match: { title: "文章标题" } // 匹配特定的文章
            },
            {
                $project: {
                    title: 1,
                    comments: {
                        $slice: [
                            {
                                $sortArray: {
                                    input: "$comments",
                                    sortBy: { time: -1 } // 按时间降序排列
                                }
                            },
                            0, 9999 // 返回所有排序后的评论
                        ]
                    }
                }
            }
        ]).toArray();

        console.log(result);
    } finally {
        await client.close();
    }
}

sortComments().catch(console.error);

在这个示例中,我们首先使用 $match 阶段匹配特定的文章,然后使用 $project$sortArray 阶段对 comments 数组中的元素进行排序。最后,使用 $slice 将排序后的数组返回。

这段代码可以实现对嵌套数组 comments 的排序,从而按时间顺序获取评论。希望这对你有所帮助!

回到顶部