Mongodb 获取聚合框架中的最后组合

2024-04-30

有一个消息集合:

{
  "date": NumberLong(1421134514),
  "sender": "53172480f9cd0e682840b9f7",
  "recipient": "52f37fbaf9cd0e02773c97b1",
  "isRead": false,
  "_id": "54b4cab2f6a48ce34f8b5a75",
  "text": "Hello!"
},
{
  "date": NumberLong(1421135561),
  "sender": "53172480f9cd0e682840b9f7",
  "recipient": "52f37fbaf9cd0e02773c97b1",
  "isRead": false,
  "_id": "54b4cec9f6a48ce34f8b6429",
  "text": "Hello 2!"
},
{
  "date": NumberLong(1421135618),
  "sender": "53072122f9cd0ee76306dc5a",
  "recipient": "52f37fbaf9cd0e02773c97b1",
  "isRead": false,
  "_id": "54b4cf02f6a48ce54f8b62f9",
  "text": "Hello 3!"
},
{
  "date": NumberLong(1421136457),
  "sender": "52f37fbaf9cd0e02773c97b1",
  "recipient": "52ea178ff9cd0e9f24d776b4",
  "isRead": false,
  "_id": "54b4d249f6a48ce54f8b6b9f"
  "text": "Hello 4!"
}

有必要选择后者的对话,其中当前用户是发送者或接收者。

例如,对于 ID = '52f37fbaf9cd0e02773c97b1' 的用户,应获取 3 条记录。

结果是构建两个单独的查询:

$result = \DB::$connection->message->aggregate(array(
    array('$match' => array('sender' => \Core::getModule('users')->user->_id)),
    array('$group' => array('_id' => '$recipient')),
));

$result2 = \DB::$connection->message->aggregate(array(
    array('$match' => array('recipient' => \Core::getModule('users')->user->_id)), 
    array('$group' => array('_id' => '$sender')),
));

是否有可能以某种方式将这两个查询合并为一个并按日期对记录进行排序?


这里您需要的是为“发送者和接收者”的每个组合生成的“唯一密钥”值。如果您想定期执行此操作,那么我建议将该值存储在文档中。但这是使用聚合框架解决问题的一种方法:

 db.messages.aggregate([
    { "$project": {
       "combined": { "$map": {
           "input": { "$literal": ["A","B"] },
           "as": "bin",
           "in": { "$cond": [ 
               { "$eq": [ "$$bin", "A" ] },
               "$sender",
               "$recipient"
           ]}
       }},
       "doc": "$$ROOT"
    }},
    { "$unwind": "$combined" },
    { "$sort": { "_id": 1, "combined": 1, "doc.date": -1 } },
    { "$group": {
        "_id": "$_id",
        "combined": { "$push": "$combined" },
        "doc": { "$first": "$doc" }
    }},
    { "$group": {
        "_id": "$combined",
        "doc": { "$first": "$doc" }
    }}
])

这会将样本范围缩小到“发件人/收件人”上的“唯一”3 个组合,并返回该“对”之间对话中的最后一个文档:

{
    "_id" : [
            "52f37fbaf9cd0e02773c97b1",
            "53172480f9cd0e682840b9f7"
    ],
    "doc" : {
            "_id" : "54b4cec9f6a48ce34f8b6429",
            "date" : NumberLong(1421135561),
            "sender" : "53172480f9cd0e682840b9f7",
            "recipient" : "52f37fbaf9cd0e02773c97b1",
            "isRead" : false,
            "text" : "Hello 2!"
    }
}
{
    "_id" : [
            "52f37fbaf9cd0e02773c97b1",
            "53072122f9cd0ee76306dc5a"
    ],
    "doc" : {
            "_id" : "54b4cf02f6a48ce54f8b62f9",
            "date" : NumberLong(1421135618),
            "sender" : "53072122f9cd0ee76306dc5a",
            "recipient" : "52f37fbaf9cd0e02773c97b1",
            "isRead" : false,
            "text" : "Hello 3!"
    }
}
{
    "_id" : [
            "52ea178ff9cd0e9f24d776b4",
            "52f37fbaf9cd0e02773c97b1"
    ],
    "doc" : {
            "_id" : "54b4d249f6a48ce54f8b6b9f",
            "date" : NumberLong(1421136457),
            "sender" : "52f37fbaf9cd0e02773c97b1",
            "recipient" : "52ea178ff9cd0e9f24d776b4",
            "isRead" : false,
            "text" : "Hello 4!"
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongodb 获取聚合框架中的最后组合 的相关文章

随机推荐

  • 如何在屏幕上锚定 Tkinter 窗口(不可移动窗口)

    我正在尝试在特定位置打开 tkinter 如果它是不可移动的 那就更好了 我搜索文档和其他内容 但没有找到任何相关内容 最好的方法是将顶部或底部固定在一个位置 x y 如果需要 我可以调整窗口大小 def my functions prin
  • 发布版本和 CLI 出现 aurelia-dialog 错误

    我在使用新的 aurelai 版本时遇到问题 我使用以下命令创建了一个新应用程序 au new myApp 我通过 npm 安装了 aurelia dialog 当我导入 aurelia dialog 并尝试使用运行应用程序时 au run
  • 为什么我的 android 项目中 onStart() 方法在 onCreate 之前运行?

    根据 Activity 的生命周期 onCreate 在应用创建时会被调用一次 然后 onStart 方法在整个 Activity 生命周期中可能会被调用多次 然而这并不是发生在我身上的事情 我的 onCreate 方法中有以下代码 mRe
  • App Engine Cron 作业始终返回 HTTP 状态代码 301

    我已关注本指南 https cloud google com appengine docs flexible ruby scheduling jobs with cron yaml为我的 Rails 应用程序创建 cron 作业 但 HTT
  • 标签 标签语义

    我读了this https stackoverflow com questions 1094352 can a label only refer to input elements我通常使用跨度或强来描述 文本标签 对于最佳实践来说这是真的
  • org.dozer.MappingException:找不到字段的读取或写入方法

    org dozer MappingException 找不到字段的读取或写入方法 tarShipMethodCode lmCourier courierName 在类 class com essilor ong domain invento
  • 比较字符变量

    我想在 R Studio 中比较两个不同的字符变量 第一列 BZ Pred 显示参与者预测的 5 个最常用的应用程序 第二列 BZ Act 显示实际使用最多的 5 个应用程序 现在我想创建第三列 如果第一个应用程序被正确猜测 则包含 是 如
  • ASP.NET 中的网络凭据错误

    我正在尝试使用 NetworkCredential 类通过 ASP NET 访问网页 但是我不断收到以下消息的异常System Security Cryptography CryptographicException The handle
  • 为什么在将应用程序部署到 Heroku 时会出现此错误?

    使用 git hub 将应用程序部署到 heroku 时遇到某种错误 问题是 我不理解 heroku 日志和随之而来的错误 这是 Heroku 日志 Marcuss MacBook Pro Weather App marcushurney
  • 公钥的长度(加密)可以与私钥不同吗?

    我有一个 1024 位的私钥 并用它来生成公钥 这是否自动意味着我的公钥也具有 1024 加密 或者它的加密大小可以更小吗 512 256 PS 我最感兴趣并谈论的是 RSA 密钥中模数 n 的大小 大小通常为 1024 或 2048 位
  • 启用 WCF 数据服务默认接受/返回 JSON

    我有一个 WCF 数据服务 我希望默认情况下为所有操作返回 JSON 我可以在配置 通过服务属性中设置它吗 为了通过 format 标签启用 json 如下所示 host 8038 YourService svc format json 将
  • 您会在新的商业项目中使用 S#arp 架构吗?

    The S arp 架构 http code google com p sharp architecture 看起来真的很酷 但是您是否认为它仍然太新而无法在重要的新项目中做出承诺 我们假设该项目乍一看很适合它 It all seems非常
  • 无法在 XAMPP 和 Windows XP 上安装 Xdebug

    我知道 这个问题已经被问过好几次了 但答案并没有解决我的问题 我在 Windows XP SP3 上运行 XAMPP 1 8 2 并且在安装 XDebug 时遇到困难 我从网站下载了XDebug 不幸的是 安装向导对我不起作用 我的 PHP
  • 如何在 CSV 文件中插入新行?

    我正在创建一个系统 其中涉及创建用于错误记录的 CSV 我当前的代码成功创建了一个具有唯一名称的新文件 然后将现有数据 来自数组 添加到 CSV 中 我遇到的问题是在文件中添加新行 这是维持正确结构所必需的 我现有的代码 current f
  • rvm 监控延迟作业

    我正在尝试使用 monit 运行delayed job 但它无法运行 因为 rvm 的路径 每个用户的本地 rvm 安装 对该命令不可用 我的应用程序是一个带有捆绑器的rails2应用程序 Monit 无法找到捆绑程序 有人对我如何了解 m
  • 致命错误:未找到“MongoDB\Driver\Manager”类

    我想使用 MongoDB 驱动程序 但当我使用它时 它抛出一个错误 mongo new MongoDB Driver Manager mongodb localhost 27017 错误 消息 未找到类 MongoDB Driver Man
  • 合并 Pandas Dataframe:如何添加列和替换值

    我有一个数据帧 df1 并想要合并其他 许多 数据帧 df2 以便 合并发生在匹配的 多 索引上 如果缺失 将创建新列 如果列已存在 则替换值 正确的 pandas 操作是什么以及使用什么参数 我查看了 concat join merge
  • 解析 JSONException:JSONArray 文本必须以字符 1 处的 '[' 开头

    我正在尝试将 Android 应用程序与本地 MySQL 数据库连接 但遇到问题 解析 JSON 数组 我在这里阅读了所有类似的问题 但没有任何作用 错误消息 Error parsing data org json JSONExceptio
  • 使用 Sheets API v4 获取与 Google 帐户关联的所有电子表格的列表

    使用 Google Sheets API v4 我希望获取附加到我的帐户的电子表格列表 我做了很多研究 但还没有找到任何解决方案 v4 API 不提供列出电子表格的方法 您需要使用 Drive API 这从以前的 API 页面迁移 http
  • Mongodb 获取聚合框架中的最后组合

    有一个消息集合 date NumberLong 1421134514 sender 53172480f9cd0e682840b9f7 recipient 52f37fbaf9cd0e02773c97b1 isRead false id 54