我应该如何在 MongoDB 中实现这个模式?

2023-12-01

我正在尝试编写一个跟踪脚本,但在弄清楚数据库应该如何工作方面遇到了麻烦。

在 MySQL 中,我创建一个类似于以下的表

User:
   username_name: string

Campaign:
   title: string
   description: string
   link: string

UserCampaign:
   user_id: integer
   camp_id: integer

Click:
   os: text
   referer: text
   camp_id: integer
   user_id: integer

我需要能够:

  • 查看每次点击的信息,如 IP、Referer、操作系统等
  • 查看来自 X IP、X Referer、X OS 的点击次数
  • 将每次点击与用户和营销活动相关联

如果我按照以下方式做某事

User {
     Campaigns: [
         {
           Clicks: []
         }
     ]
}

我遇到两个问题:

  • 它为每个用户创建一个新的活动对象,这是一个问题,因为如果我需要更新我的活动,我需要为每个用户更新对象
  • 我希望 Clicks 数组包含大量数据,我觉得将它作为 User 对象的一部分会使查询速度非常慢

好的,我认为你需要将其分解为基本的“品种”。

您有两个“实体”样式的对象:

  • User
  • Campaign

您有一个“映射”样式的对象:

  • UserCampaign

您有一个“事务”样式的对象:

  • Click

第1步:实体

让我们从简单的开始:User & Campaign。它们确实是两个独立的对象,没有一个对象真正依赖于另一个对象的存在。两者之间也没有隐式的层次结构:用户不属于营销活动,营销活动也不属于用户。

当你有两个像这样的顶级对象时,它们通常会获得自己的收藏。所以你会想要一个Users集合和一个Camapaigns收藏。

第 2 步:映射

UserCampaign目前用于表示 N 到 M 的映射。现在,一般来说,当您有 N 到 1 的映射时,您可以将 N 放在 1 的内部。但是,对于 N 到 M 的映射,您通常必须“选择一边”。

理论上,您可以执行以下操作之一:

  1. 列一个清单Campaign ID每个里面都有User
  2. 列一个清单Users ID每个里面都有Campaign

就我个人而言,我会做#1。您可能有更多的用户参与营销活动,并且您可能希望将数组放在更短的位置。

第三步:交易

Clicks 确实是一个完全不同的野兽。从客观角度来看,你可以这样想:Clicks“属于”一个User, Clicks“属于”一个Campaign。因此,从理论上讲,您可以将点击存储为这些对象中的任何一个的一部分。人们很容易认为点击属于under用户或活动。

但如果真正深入挖掘的话,上面的简化确实是有缺陷的。在你的系统中,Clicks确实是一个中心对象。事实上,您甚至可以说用户和营销活动实际上只是与点击“相关”。

查看您提出的问题/疑问。所有这些问题实际上都围绕着点击。用户和营销活动不是数据中的中心对象,点击才是。

此外,点击将是您系统中最丰富的数据。您将获得比其他任何东西都多的点击次数。

这是为此类数据设计模式时最大的问题。有时,当“父”对象不是最重要的事情时,您需要推迟它们。想象一下构建一个简单的电子商务系统。很明显orders将“属于”users, but orders对于系统来说是如此重要,以至于它将成为一个“顶级”对象。

把它包起来

您可能需要三个集合:

  1. 用户 -> 有活动列表._id
  2. Campaign
  3. 点击次数 -> 包含 user._id、campaign._id

这应该满足您的所有查询需求:

查看每次点击的信息,如 IP、Referer、操作系统等

db.clicks.find()

查看来自 X IP、X Referer、X OS 的点击次数

db.clicks.group()或运行映射减少.

将每次点击与用户和营销活动相关联

db.clicks.find({user_id : blah})还可以将点击 ID 推送到用户和营销活动中(如果有意义的话)。

请注意,如果您有大量的点击,您确实必须分析您运行最多的查询。您无法对每个字段建立索引,因此您通常需要运行 Map-Reduce 来“汇总”这些查询的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何在 MongoDB 中实现这个模式? 的相关文章

  • Mongodb 聚合使用 $group 两次

    我在 mongo 中有一堆文档 其结构如下 id number 2 colour id name Green hex 00ff00 position id name Defence type position ageGroup id nam
  • 将 MongoDb 同步到 ElasticSearch

    我正在寻找一种将 MongoDB 中的集合与 Elastic Search ES 同步的方法 目标是以 MongoDB 作为主要数据源 并使用 MongoDB 作为全文搜索引擎 我的项目的业务逻辑是用python写的 网上有多种方法可供选择
  • Morphia - 未在 dbObj 中找到定义的类

    我有一个相当有趣的问题 当尝试从 Mongo 实例加载模型时 Morphia 会抛出以下错误 22 17 13 WARN Class not found defined in dbObj java lang ClassNotFoundExc
  • 当使用带 _id 的复合分片键时,MongoDB 是否确保唯一的 _id 字段值

    我想启动分片 如您所知 分片键非常重要 我发现 使用 id 以外的分片键时 MongoDB 不确保 id 字段值唯一 http docs mongodb org manual faq sharding how does mongodb en
  • mongodb - 一个集合中的许多文档与多个集合中的许多文档

    我使用 mongodb 作为数据库存储 我的网络应用程序必须收集用户响应 用户响应是 mongodb 中的文档 或 sql 中的一行 一个文档的长度大约是10 200 用户响应被分类 仅到一个类别 每个类别的用户响应数在100 5000之间
  • 如何检查Mongodb企业版是否正在使用

    如何查看是否使用的是mongodb企业版 有没有我可以查询的标志或属性 mongod version只返回版本 我最近在 MongoDB JIRA 上问了这个问题 回复如下 至少可以通过三种方法来确定您是否正在运行 Enterprise 我
  • Mongodb聚合,如何按间隔标准对文档进行计数?

    我的 MongoDB 文档如下所示 StatCode LoadTime 例如 数据可能如下所示 id StatCode LoadTime 1 200 0 345 2 200 0 234 3 200 0 396 4 200 1 234 5 2
  • 我可以通过mongo shell重启mongodb服务器吗?

    我可以通过 mongo CLI 客户端重新启动 MongoDB 服务器吗 您无法从客户端停止和启动 重新启动 它 正如 i kimiko 已经提到的 你可以在客户端上关闭它db shutdownServer 通过 mongo shell数据
  • 使用mongodb聚合框架按数组长度分组

    我有一个看起来像这样的集合 id id0 name saved things id id1 name saved things id id2 name saved things etc 我想使用 mongodb 的聚合框架来得出一个直方图结
  • 如何减少嵌套文档聚合管道中的展开阶段?

    我是 mongodb 新手 正在尝试使用嵌套文档 我有一个查询如下 db EndpointData aggregate group id EndpointId RequestCount sum 1 FirstActivity min Dat
  • 如何获取 bson 文档的大小(以字节为单位)

    bson文档的size 函数返回的int值是字节数吗 无法找到此 API 的详细信息 如何获取 bson 文档的大小 以字节为单位 这是我的代码 import org bson Document MongoDatabase db Mongo
  • Mongoose嵌入式文档更新

    我在嵌入式文档更新方面遇到问题 我定义的架构 var Talk new Schema title type String required true content type String required true date type D
  • MongoDB $geoIntersects 不适用于包含负顶点的多边形

    我已在数据库中存储了跨越 x 轴和 y 轴的多边形 并且我想搜索包含给定点的多边形 为此 我使用 geoIntersects 运算符来指定一个点 但是 当多边形穿过轴时 MongoDB 不会返回任何多边形 我可以对查询或架构进行任何小的更改
  • Mongodb 限制聚合查询中的数组

    我正在尝试编写一个查询来返回每个类别中的前 X 个术语 例如前 5 个 前 10 个等 每个术语都有一个关联的类别 并且基于另一个术语的帮助堆栈溢出问题 https stackoverflow com questions 25666187
  • Mongodb 聚合嵌套组以及最近更新的文档

    我已经在我的集合中指定了人员 状态 如下所示 ASSIGN ID 583f84bce58725f76b322398 SPEC ID 58411771 STATUS 1 UPDATE DATE ISODate 2016 12 21T04 10
  • Mongodb 数据库上的 SASL 身份验证失败

    我在尝试使用 PHP Mongodb 驱动程序连接到 Mongodb 时遇到问题 实际上我有一个名为 LRS 的数据库 它有一个名为 juano 的用户 在我的设置文件中带有密码 12345 我确信我编写了正确的配置 但是当我在 Larav
  • MongoDB,从数组中删除对象

    Doc id 5150a1199fac0e6910000002 name some name items id 23 name item name 23 id 24 name item name 24 有没有办法从数组中提取特定对象 IE
  • Id 或 [TableName]Id 作为主键/实体标识符

    是否首选使用 Id 作为主键的列名或 TableName Id 作为命名约定 表 账户主键 ID 相对 表 账户主键 AccountId 在我见过的实现中 它似乎分为 50 50 左右 每种方法的优点和缺点是什么 跟进 在我的数据库中使用一
  • 如何跟踪用户在 X 天内每天访问该网站?

    Stack Overflow 上有一个新徽章 这 woot https stackoverflow com badges 71 woot enthusiast 徽章将授予连续 30 天内每天访问该网站的用户 如何实现这样的功能 如何以最简单
  • 在 MongoDB 聚合的“addField”操作中使用“$count”

    我正在尝试找到聚合运算符的正确组合 以将标题为 totalCount 的字段添加到我的 mongoDB 视图中 这将为我提供聚合管道特定阶段的计数 并将其输出为每个文档的计数结果 count count 但最终我得到了一个具有此结果的文档

随机推荐

  • 找不到 adobe acrobat 10.0 类型库 (2020)

    我正在尝试使用 VBA 从 pdf 中读取一些文本 我读到我需要引用该库 Adobe Acrobat 10 0 Type Library 因此 我从以下位置下载了适用于 Windows 的 Acrobat DC SDK 下载页面 但是我查看
  • AutoFixture 约束字符串参数

    有没有一种简单的方法来指定参数 orderBy 的可能值列表 请不要一一列举 否则我也不会提问 我想指定 orderby 仅当从预定列表中选择时才有意义 假设列表非常大 仍然不是随机的 这不可能那么难 没有一个例子可以说明如此简单的任务 T
  • 单选按钮检查的更改事件未在 gridview 中触发

    我有一个网格视图 其中有一个单选按钮 我需要的是在选择单选按钮时我必须找到网格视图的数据键 还有一个问题是 我可以选择多个单选按钮 这是不应该发生的 您需要使用文字控件来注入单选按钮标记 这将处理分组 因此仅选择一个单选按钮 您无法使用标准
  • Chrome 自动化中的假地理位置

    我需要使用 python 脚本在 chrome 中自动进行地理定位 我必须伪造纬度和经度 我按照 stackoverflow 中的一些链接进行操作 但它们给出了错误 chromeDriver executeScript window nav
  • 循环运行5分钟

    我需要运行 5 分钟的 while 循环 我寻找了计时器 api 但找不到这样做 任何人都可以为此提供一个代码片段吗 Thanks 最简单的方法是检查每次迭代已经用了多少时间 例子 final long NANOSEC PER SEC 10
  • Javascript:“新日期(日期字符串)”与“新日期(年,月,日)”之间的区别

    参考这个问题的已接受答案如何在 JavaScript 中获取两个日期之间的天数 我明白了 在函数中parseDate function parseDate str var mdy str split return new Date mdy
  • 构造函数中的 C++ 引用

    我有一个类 其构造函数采用对字符串的 const 引用 该字符串充当对象的名称 因此在类实例的整个生命周期中都需要该字符串 现在想象一下如何使用这个类 class myclass public myclass const std strin
  • 尝试生成 9 位数字,每个数字都唯一

    我正在尝试获取 9 位数字 这些数字都有唯一的数字 我的第一种方法似乎有点太复杂 写起来很乏味 include
  • Facebook Open Graph 单页应用程序

    我使用主干js构建了一个单页面应用程序 我对各种应用程序状态和动态内容 例如书籍 有单独的骨干 url 路由 但本质上 Facebook 只会看到索引页面 以下问题似乎提供了一种有趣的方法来为动态内容提供物理开放图 URL 同一页面上有多个
  • 通过命令行调用laravel控制器

    在 kohana 框架中 我可以使用命令行通过命令行调用控制器 php5 index php uri controller method var1 var2 是否可以通过 cli 在 Laravel 5 中调用我想要的控制器 如果是 该怎么
  • 通过 BigCommerce API 访问 Google 购物字段

    我正在与第三方零件供应商创建自定义集成 以在 BigCommerce 的库存中创建产品 我需要能够为导入的产品打开 Google 购物并添加 MPN 和类别 但我不知道如何在 API 中修改它 如果有人有任何反馈 请告诉我 因此 在联系 B
  • 更新对象的嵌套数据数组(Redux)

    我在更新不可变的 redux 和相当嵌套的数据时遇到问题 这是我的数据结构和我想要更改的内容的示例 如果有人可以向我展示使用 ES6 和扩展运算符访问此更新的模式 我将不胜感激 const formCanvasInit id guid fi
  • 如何正确关闭客户端和服务器中的套接字(python)

    我正在用 python 编写 2 个脚本 客户端 py 服务器 py 客户端和服务器之间有一个套接字 场景是这样的 我有一个客户端要求关闭程序 因此它应该通知服务器 然后服务器将通知另一个客户端 因此我需要关闭从客户端 1 到服务器的套接字
  • Angular2 HTTP 使用 observables 订阅显示数据未定义

    我不知道我做错了什么 但不知怎的 我无法读取数据 尽管数据来自服务器响应 甚至当我放置控制台时数据也显示在服务 extractData 方法中 但是在订阅函数内的组件中 它给了我未定义的信息 帮我看看我做错了什么 我假设这是异步的问题 但是
  • 使用 WCF 服务返回 MembershipUser

    我有 WCF 服务从 ActiveDirectory 获取用户 我从请求 用户名 接收参数并使用 MembershipUser 属性创建响应 由于某种原因 联系变得紧密 服务操作找到用户并成功创建响应 执行行时 返回响应 我在客户端遇到异常
  • 无法使用 CreateJS 预加载和显示 SVG

    我正在尝试预加载一组 SVG 对象并使用 CreateJS PreloadJS 显示它们 到目前为止 我能够在不预加载的情况下显示 SVG 对象 但是一旦我使用 PreloadJS 中的 LoadQueue 我就无法让我的示例工作 有人知道
  • 在tableview中延迟加载图像

    我试图以惰性模式加载我的 uitableviewcells 的图像 我试图以最简单的方式做到这一点 我看到了很多例子 但它们超出了我的目的 这就是我目前正在做的事情 但它不起作用 Configure the cell Info info s
  • 创建 TRESTClient 时出错:“没有注册具有 guid [{}] 接口的对等点”

    我已经创建了我的类来使用 REST 我在运行时遇到 TRESTClient 组件问题 TFrwWebServiceREST class TInterfacedObject IRESTWebServiceProxy private FClie
  • 仅从 DateTime 对象获取日期或时间

    我有一个DateTime具有日期和时间的实例 如何仅提取日期或仅提取时间 var day value Date a DateTime that will just be whole days var time value TimeOfDay
  • 我应该如何在 MongoDB 中实现这个模式?

    我正在尝试编写一个跟踪脚本 但在弄清楚数据库应该如何工作方面遇到了麻烦 在 MySQL 中 我创建一个类似于以下的表 User username name string Campaign title string description s