iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >聚合,将一个集合中的数据插入到另一个集合中
  • 236
分享到

聚合,将一个集合中的数据插入到另一个集合中

2024-02-11 05:02:04 236人浏览 薄情痞子
摘要

PHP小编柚子在这篇文章中将为大家介绍一个常见的操作——聚合,即将一个集合中的数据插入到另一个集合中。聚合操作在编程中非常常见,可以用于合并数据、去重、筛选等多种场景。通过聚合操作,我

PHP小编柚子在这篇文章中将为大家介绍一个常见的操作——聚合,即将一个集合中的数据插入到另一个集合中。聚合操作在编程中非常常见,可以用于合并数据、去重、筛选等多种场景。通过聚合操作,我们可以轻松地对数据进行处理和管理,提高代码的效率和可读性。接下来,我们将详细介绍聚合操作的使用方法及注意事项,帮助大家更好地掌握这一技巧。

问题内容

我正在尝试执行以下操作,从特定用户的 chat 集合中获取聊天列表,并将发送的 message 集合中的最后一条消息添加到每个聊天的该列表中。

现在这是如何工作的,我有两种方法,如下所述

首先,我只是使用聊天成员 id 获取聊天列表,第二种方法使用聚合来查找每个聊天的最后一条消息,然后我只需将消息与聊天 id 进行匹配

收藏聊天:

type chat struct {
    id           string   `JSON:"id" bson:"id"`
    participants []string `json:"participants" bson:"participants"`
    lastmessage  *message `json:"last_message,omitempty" bson:"last_message"`
    ...
}

附注 lastmessage - 始终为零,我只需要它来为用户编写响应。

集合message

type message struct {
    id         string `json:"id" bson:"id"`
    chatid     string `json:"chat_id" bson:"chat_id"`
    fromid     string `json:"from_id" bson:"from_id"`
    createdate int64  `json:"create_date" bson:"create_date"`
    body     string `json:"body" bson:"body"`
    updateat int64  `json:"update_at" bson:"update_at"`
    ...
}

第一种方法:我需要此方法来获取特定聊天参与者的活动聊天列表。

func activechats(ctx context.context, uid string) ([]*chat, error) {
    ...
    filter := bson.d{primitive.e{key: "participants", value: uid}}
    cursor, err := r.col.find(ctx, filter, nil)
    if err != nil {...}

    var ch []*chat
    if err = cursor.all(ctx, &ch); err != nil {...}

    if err = cursor.close(ctx); err != nil {...}
    ...
}

第二种方法:我需要此方法来获取每个聊天的最后一条消息,输入是一组聊天 id,并且对于每个聊天,我都会搜索最后一条消息(如果有)。为此,我使用聚合。

func lastmessages(ctx context.context, chatids []string) (map[string]*message, error) {

    matchstage := bson.d{
        primitive.e{
            key: "$match", value: bson.d{
                primitive.e{
                    key: "chat_id", value: bson.d{
                        primitive.e{key: "$in", value: chatids},
                    },
                },
            },
        }}
    sortstage := bson.d{primitive.e{key: "$sort", value: bson.d{primitive.e{key: "created", value: -1}}}}
    groupstage := bson.d{primitive.e{
        key: "$group", value: bson.d{
            primitive.e{
                key: "_id", value: bson.d{
                    primitive.e{key: "chat_id", value: "$chat_id"},
                },
            },
            primitive.e{
                key: "message", value: bson.d{
                    primitive.e{key: "$first", value: "$$root"},
                },
            },
        },
    }}

    cursor, err := r.colmessage.aggregate(ctx, monGo.pipeline{matchstage, groupstage, sortstage})
    if err != nil {...}

    var res []*aggregationresultgenerated
    if err = cursor.all(ctx, &res); err != nil {...}
    ...
}

我知道这是一个非常糟糕的解决方案,但这是我迄今为止所能想到的,非常遗憾(不工作)。我尝试解决这个问题

db.chat.aggregate([
    {
        $match: {
            participants: "participant_id",
    },
    {
        $lookup: {
            from: "message", // other table name
            localfield: "id", // name of chat table field
            foreignfield: "chat_id", // name of message table field
            as: "msg",
        }
    },
    {
        $unwind: "$msg",
    },
    {
        $match: {
            chat_id : {
                $in: ["$$root._id"],
            },
        },
    },
    {
        $sort: {
            "created": -1,
        },
    },
    {
        $group: {
            "_id": {
                "chat_id": "$chat_id"
            },
            "doc": {
                "$last": "$$root"
            }
        }
    },
    {
        $project: {
            last_message: "$msg",
        }
    }
])

我的问题是:如何使用聚合来获取特定用户的聊天列表,并为每个聊天从 message 集合中添加对象 chat 中字段 last_message 中的最后一条消息? 现在如何运作:

{
    "chats": [
        {
            "id": "4hWsHam3ZZpoyIw44q3D",
            "title": "Chat example",
            "create-date": 1674476855918,
            "participants": [
                "63ce54460aeee5e72c778d90",
                "63ce54460aeee5e72c778d92"
            ],
            "owner_id": "63ce54460aeee5e72c778d90",
            "last_message": {
                "id": "tzwekCiCLSXJ4tfdQuHH",
                "chat_id": "4hWsHam3ZZpoyIw44q3D",
                "from_id": "63ce54460aeee5e72c778d92",
                "create_date": 1674557062031,
                "body": "text",
                "update_at": 0,
                "viewed": false
            },
            "unread": 5
        },
        {
            "id": "Anjrr9RCWFzq030Cwz7S",
            "title": "New chat One",
            "create-date": 1674476909054,
            "participants": [
                "63ce54460aeee5e72c778d90",
                "63ce54460aeee5e72c778d96"
            ],
            "owner_id": "63ce54460aeee5e72c778d90",
            "last_message": {
                "id": "7YqhhS1-EfMRSZtGCH0Z",
                "chat_id": "Anjrr9RCWFzq030Cwz7S",
                "from_id": "63ce54460aeee5e72c778d96",
                "create_date": 1674575017115,
                "body": "text",
                "update_at": 0,
            },
            "unread": 1
        },
    ]
}

解决方法

编辑:正如op在评论中提到的,update/$merge到集合是没有必要的。

您可以简单地在 $lookup 的子管道中执行 $sort + $limit 方法。执行 $unwind 将查找结果写入 last_message 字段。最后,执行 $merge 以更新回 chat 集合。

db.chat.aggregate([
  {
    $match: {
      participants: "63ce54460aeee5e72c778d90",
      
    }
  },
  {
    $lookup: {
      from: "message",
      localField: "id",
      foreignField: "chat_id",
      pipeline: [
        {
          $sort: {
            created: -1
          }
        },
        {
          $limit: 1
        }
      ],
      as: "last_message",
      
    }
  },
  {
    $unwind: {
      path: "$last_message",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $project: {
      last_message: "$last_message"
    }
  }
])

mongo 游乐场

这里是一个 mongo playground 与 $merge 进行更新到一个集合。

以上就是聚合,将一个集合中的数据插入到另一个集合中的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 聚合,将一个集合中的数据插入到另一个集合中

本文链接: https://www.lsjlt.com/news/563352.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 聚合,将一个集合中的数据插入到另一个集合中
    php小编柚子在这篇文章中将为大家介绍一个常见的操作——聚合,即将一个集合中的数据插入到另一个集合中。聚合操作在编程中非常常见,可以用于合并数据、去重、筛选等多种场景。通过聚合操作,我...
    99+
    2024-02-11
  • 怎么在mongodb中插入一个集合
    在mongodb中插入集合的方法:1.启动mongodb服务;2.登录mongodb数据库;3.使用数据库;4.使用createCollection方法插入集合;具体步骤如下:首先,在命令行中启动mongodb服务;net start Mo...
    99+
    2024-04-02
  • SQL怎么将一个表中的数据插入到另一个表中
    这篇文章主要介绍了SQL怎么将一个表中的数据插入到另一个表中的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL怎么将一个表中的数据插入到另一个表中文章都会有所收获,下面我们一起来看看吧。创建测试表MyStud...
    99+
    2023-06-29
  • SQL将一个表中的数据插入到另一个表中的方法
    创建测试表MyStudentInfo CREATE table MyStudentInfo ( Id int not null primary key, Name varch...
    99+
    2024-04-02
  • Mongo怎么根据另外一个集合对当前集合进行操作
    本篇内容介绍了“Mongo怎么根据另外一个集合对当前集合进行操作”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • sql怎么将多个结果集合并到一行
    在SQL中,可以使用`GROUP_CONCAT`函数将多个结果集合并到一行。假设我们有一个名为`employees`的表,包含以下数...
    99+
    2023-10-12
    sql
  • stream流获取集合中一个字段
    例子:         List refOrderProductPos 我现在有这个集合 我想通过stream流 把这个集合中 每一个对象里面的 skuNo 放到一个新的集合里面            可以使用map操作将每个RefOrde...
    99+
    2023-09-13
    算法 java
  • C#中怎么找到两个集合的交集
    在C#中,可以使用LINQ(Language-Integrated Query)来找到两个集合的交集。下面是一个示例代码: usin...
    99+
    2024-04-02
  • 【mysql将一个表的数据添加到另一个表中】
    mysql将一个表的数据添加到另一个表中 两个表的结构一致: ## 将表B数据添加到A中INSERT INTO A SELECT * FROM B; 插入时若存在主键冲突,使用以下sql删掉...
    99+
    2023-09-12
    mysql 数据库
  • MySQL数据查询中如何使用集合/聚合函数查询
    小编给大家分享一下MySQL数据查询中如何使用集合/聚合函数查询,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!MySQL聚合函数如下:函数作用avg()返回某列的平均值count()返回某...
    99+
    2024-04-02
  • Java8怎么从一个list中获取某一元素集合
    本篇内容介绍了“Java8怎么从一个list中获取某一元素集合”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!从一个list中获取某一元素集合...
    99+
    2023-07-02
  • Java8如何从一个list中获取某一元素集合
    目录从一个list中获取某一元素集合提取出list中bean的某一属性从一个list中获取某一元素集合 @Data public class Person { private...
    99+
    2024-04-02
  • jdk8使用stream实现两个list集合合并成一个(对象属性的合并)
    目录一、前言二、示例示例1:java8 合并两个 list<map>示例2:java8 合并两个 list<T>示例3:java8 合并两个 list<T>,集合个数前者小于后者,要...
    99+
    2024-04-02
  • 怎么优雅地实现判断一个值是否在一个集合中
    本篇内容介绍了“怎么优雅地实现判断一个值是否在一个集合中”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!版本...
    99+
    2024-04-02
  • sql多个结果集合并到一行怎么实现
    在SQL中,可以使用UNION ALL操作符将多个结果集合并成一个结果集。例如: SELECT column1 FR...
    99+
    2024-04-09
    sql
  • java如何统计集合中相同数据的个数
    可以使用HashMap来统计集合中相同数据的个数。具体的步骤如下:1. 使用HashMap来创建一个空的映射表,其中key表示集合中...
    99+
    2023-09-26
    java
  • Java中的集合框架:理解Java中的数据结构和集合
    文章目录 Java中的集合框架:理解Java中的数据结构和集合1. 引言2. 技术原理及概念2.1 基本概念解释2.2 技术原理介绍 3. 实现步骤与流程3.1 准备工作:环境配置与依赖...
    99+
    2023-10-04
    数据结构 java 链表
  • SqlServer将数据库中的表复制到另一个数据库
    目录SqlServer将数据库中的表复制到另一个数据库一、如果两个数据库在同一台服务器上二、如果两个数据库在不同的服务器上复制表结构与数据的图文方法复制表结构表的数据内容复制图文方法...
    99+
    2024-04-02
  • Python中的集合一起来学习一下
    目录一、什么是集合二、集合的创建方式三、集合的相关操作3.1集合元素的判断操作3.2集合元素的新增操作3.3集合元素的删除操作四、集合之间的关系五、集合的数学操作六、集合生成式总结一...
    99+
    2024-04-02
  • MySQL 从一个表中查出数据并插入到另一个表处理方案(详细)
    PS:来源表:t_source、目标表:t_target 第一种 来源表和目标表字段完全一致 insert into t_target select * from t_source;...
    99+
    2023-09-03
    mysql 数据库 sql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作