【问题标题】:Mongoose NodeJS - Find the last inserted record per userMongoose NodeJS - 查找每个用户最后插入的记录
【发布时间】:2017-06-23 20:47:32
【问题描述】:

谈到 NoSQL 和 Mongoose,我还是个新手。我一直在搜索,但无法真正找到我正在寻找的东西(这让我更难知道答案)。

基本上,我有一个用户正在添加的记录列表。这些记录包含一些数据,我想列出每个用户最新插入的消息。

我会用 SQL 编写;

SELECT * FROM records ORDER BY inserted_date GROUP BY user_id;

这将返回一个这样的集合;

[
    {user: 2, insert_date: 2015-08-12T15:15:00, message: "Hi"},
    {user: 3, insert_date: 2015-08-12T15:12:00, message: "Also hi"},
    {user: 5, insert_date: 2015-08-12T15:14:00, message: "Not hi"}
]

我一直在环顾四周,找到了一些答案,但似乎没有用。

我试过了;

https://stackoverflow.com/a/7570091/1493455

还有其他一些类似的聚合事物;

Record.aggregate(
    {},
    { 
        $group: {
            _id: '$user_id',
            inserted: { $last: "$inserted" },
            message: { $last: "$message" }
        }
    },
    function(err, messages) {
        console.log(err, messages);
    }
);

我从另一个答案中复制了它 - 但我真的不明白它在做什么以及它甚至应该做什么。

我当然可以对每个用户使用排序和限制查询,但这似乎非常低效。

如果有人能指出我正确的方向,我会很高兴:)

【问题讨论】:

标签: node.js mongodb mongoose aggregation-framework


【解决方案1】:

是的,重复:Mongoose - find last message from each user

我最终修复了我的代码;

Record.aggregate(
    [
        // Matching pipeline, similar to find
        {
            "$match": {}
        },
        // Sorting pipeline
        {
            "$sort": {
                "inserted": -1
            }
        },
        // Grouping pipeline
        {
            "$group": {
                "_id": "$user_id",
                "message": {
                    "$first": "$message"
                },
                "inserted": {
                    "$first": "$inserted"
                }
            }
        },
        // Project pipeline, similar to select
        {
            "$project": {
                "_id": 0,
                "user_id": "$_id",
                "message": 1,
                "inserted": 1
            }
        }
    ],
    function(err, messages) {
        console.log(err, messages);
    }
);

并更新到最新的 mongodb (3.4) 而不是我正在运行的旧 (2.x)(这会产生错误,因为还不支持聚合)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2014-07-31
    • 2020-06-27
    • 2016-12-09
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多