在嵌套数组上使用 $unwind 的后果?

2024-02-09

假设我有 17,000 个文档,其结构类似于以下文档:

{
   someInfo: "blah blah blah",
   // and another dozen or so attributes here, followed by:
   answers:[
      {
          email: "[email protected] /cdn-cgi/l/email-protection,
          values:[
             {value: 1, label: "test1"},
             {value: 2, label: "test2"}    
          ]
      },
      {
          email: "[email protected] /cdn-cgi/l/email-protection,
          values:[
             {value: 6, label: "test1"},
             {value: 1, label: "test2"}    
          ]
      }
   ]
}

假设我使用聚合来展开两者answers and answers.values像这样:

db.participants.aggregate(
   {$unwind: "$answers"},
   {$unwind: "$answers.values"}
);

我假设它会在内存中创建一个相当大的结果集,因为它本质上是复制父对象17,000 * # of answers * # of values times.

我一直在测试一个在开发环境上执行类似操作的查询,并且查询本身的性能很好,但我想知道我是否应该担心在生产环境上运行它,因为在生产环境中,展开的结果集可能会耗尽很多记忆。 Mongo 的文档$unwind http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/讨论其工作原理,但不讨论潜在的性能问题。

我应该担心在生产系统上执行此操作吗?它会减慢针对数据库的其他查询吗?


在以下情况下了解内存资源始终是一个好主意$unwind http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/由于发生数据复制。

Using $match http://docs.mongodb.org/manual/reference/operator/aggregation/match/将结果范围缩小到您要查找的特定文档当然是减少保存返回数据所需的内存量的一种方法。

减少内存占用的另一种方法是$project http://docs.mongodb.org/manual/reference/operator/aggregation/project/. $project允许您重新组织管道中的文档,以便仅返回您感兴趣的元素。

要使用你的例子,

{
  someInfo: "blah blah blah",
  answers: [
    {
      email: "[email protected] /cdn-cgi/l/email-protection",
      values: [
        {value: 1, label: "test1"},
        {value: 2, label: "test2"}    
      ]
    },
    {
      email: "[email protected] /cdn-cgi/l/email-protection",
      values: [
        {value: 6, label: "test1"},
        {value: 1, label: "test2"}    
      ]
    }
  ]
}

With

db.collection.aggregate([{ $match: { <element>: <value> }}, { $project: { _id: 0, answers: 1}}])

将删除someInfo以及您可能不感兴趣的其他属性。那么您可以$project放松后再次...

db.collection.aggregate([
   { $match: { <element>: <value> }},
   { $project: { _id: 0, answers: 1}},
   { $unwind: "$answers"},
   { $unwind: "$answers.tags"},
   { $project: { e: "$answers.email", v: "$answers.values"}}
])

将返回相当紧凑的结果,例如:

{ e: "[email protected] /cdn-cgi/l/email-protection", v: { value: 1, label: "test1" } }
{ e: "[email protected] /cdn-cgi/l/email-protection", v: { value: 2, label: "test2" } }
{ e: "[email protected] /cdn-cgi/l/email-protection", v: { value: 6, label: "test1" } }
{ e: "[email protected] /cdn-cgi/l/email-protection", v: { value: 1, label: "test2" } }

尽管单字母属性名称降低了人类可读性,但它确实减少了因冗长的重复属性名称而膨胀的数据大小。

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

在嵌套数组上使用 $unwind 的后果? 的相关文章

  • 错误:grid.mongo.GridStore不是构造函数,使用mongoose、Grid-fs-stream和grid multer存储

    我收到以下提到的错误 基本配置如下 我已经将文件上传到服务器上 我想下载它们但出现这些错误 我向 api files delete fileId 调用了 POST 请求 它应该调用路由并将文件返回给浏览器 而不是使用网格相关模块获取错误 M
  • 为什么我的多螺纹嵌件比单螺纹嵌件性能更好?

    我调查了并发性 http docs mongodb org manual faq concurrency how granular are locks in mongodb在 MongoDB 中 显然它使用了数据库级锁定系统 我认为这意味着
  • 处理从nodejs到mongo db的连接丢失

    当nodejs和mongodb服务器之间的连接丢失时 我试图得到 连接丢失 或类似的信息 我使用本机驱动程序并具有以下代码 var mongo require mongodb var server new mongo Server host
  • 无法启动 MongoDB:Windows 中的系统错误 1067

    在 Windows Server 2008 R2 上设置 MongoDB 服务后 出现此错误 C mongodb bin gt net start MongoDB The Mongo DB service is starting The M
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • 使用 Typescript 时的 MongoDB FindOptions

    我正在将 JS 项目转换为 TS 并且在查询集合时遇到 FindOptions 问题 我只想获取集合中所有元素的 ID 这是导致 TS 错误的 TS 代码 import Collection Db Document MongoClient
  • 如何使用 mongodb 处理多个操作并获取计数?

    在这里 我为图表中的显示计数日期创建了一个查询 我已经使用了mongodb 我有一个对象 在该对象中存储多个数据并用一个值分隔Action 我想显示计数日期明智的操作 例如评论 就像两个操作计数都想显示一样 现在我只是显示评论数 我也想得到
  • 在Spring-Boot中,我们如何在同一个项目中连接两个数据库(Mysql数据库和MongoDB)?

    我正在尝试创建一个 Spring Boot 项目 其中我有一个要求 我想连接到不同的数据库 MySql 和 MongoDB 我是否需要做一些特殊的事情来连接到这两个数据库 或者 spring boot 会自动计算出自己连接到这两个数据库 我
  • 将base64图像转换为Node Js中的文件

    我是 Node Js 新手 我需要包含用户的个人资料图片 我从 IOS 应用程序收到 Base64 图像的请求 我需要将其存储在 images 文件夹中并将图像路径保存在 mongodb 数据库中 我使用了以下代码 var bitmap n
  • 将 ObjectId 字段正确映射到字符串

    我正在对 RDBMS 世界进行一些探索 进入 MongoDB 的神秘海洋 我正在使用 Spring Data 来帮助我进行冒险 我需要在两个集合中的文档之间创建手动引用 我读到 DBRef 很昂贵 我的 pojo 是这样的 public c
  • MongoDB - 在父文档中填充 GridFS 文件元数据

    我使用 NodeJS 与 Express MongoDB Mongoose 和 GridFS 来上传和检索文件 我想通过 ID 引用其他文档中的文件 并在查询其他文档时填充文件元数据 例如 如果我有一个包含这样的文档的 用户 集合 id O
  • 使用 mongoose 更新 mongoDb 中数组内的对象[重复]

    这个问题在这里已经有答案了 我正在 MongoDB 上工作 以更新 MongoDB 集合中数组内部的对象值 我的收藏就像 id ObjectId 59b7e839200a5c00ee2d2851 player New playesList
  • mongodb 通配符匹配特定键的所有值[重复]

    这个问题在这里已经有答案了 我试图弄清楚如何匹配一个键并返回该键的所有值 是否可以将值作为通配符给出 我想在值上使用通配符返回该特定键的所有内容 db collection find key 我还希望这也能返回整个集合 其中的键也与通配符值
  • 使用 or 运算符进行 Morphia 查询

    我想知道如何使用 or 运算符编写 Morphia mongodb 查询我这样写了 mongodb 查询 效果很好 db Inv find or sug id 2 grp id 2 但是当我尝试在吗啡中编写此内容时 我感到很困惑 以下查询是
  • 对开始和结束范围进行分组和计数

    如果我有以下格式的数据 id 1 startDate ISODate 2017 01 1T00 00 00 000Z endDate ISODate 2017 02 25T00 00 00 000Z type CAR id 2 startD
  • 无法解构“undefined”或“null”的属性“user”

    使用 redux 检索用户信息时出错 我想从数据库获取用户信息 姓名 密码和头像地址 然后对其进行编辑 我正在使用nodejs express react redux 和jwt Actions user js import axios fr
  • 下一个和上一个文档

    我正在制作一个图片库 每个图像都有一个 id 当我查看图像时 我想要接下来的 3 个图像和之前的 3 个图像 我怎样才能在 mongodb 查询中得到这个 我认为我可以使用 sort by id 因为这是不可排序的 也许使用mapReduc
  • Mongoose:转换为 ObjectId 失败

    我正在尝试在 MongoDB 中创建一个类别层次结构 以便通过 Mongoose 与 Node js 一起使用 我正在使用祖先数组方法 http docs mongodb org manual tutorial model tree str
  • 服务器发现和监控引擎已弃用

    我在 Node js 应用程序中使用 Mongoose 这是我的配置 mongoose connect process env MONGO URI useNewUrlParser true useUnifiedTopology true u
  • mongodb 更新所有文档,并将值增加 1 [重复]

    这个问题在这里已经有答案了 我在 mongoDB 中有几个文档 文档结构是这样的 a abc myid 2 我想用 1 更新所有文档的 myid 例如 第一个文档 myid 1 第二个文档 myid 2 依此类推 有询问吗 尝试这个查询 d

随机推荐

  • Laravel 中的长轮询(sleep() 函数使应用程序冻结)

    我正在尝试在 Laravel 中编写长轮询功能 但是当我使用 sleep 函数时 整个应用程序会冻结 阻塞 直到 sleep 函数完成 有谁知道如何解决这个问题 我的 JavaScript 看起来像这样 function startRefr
  • 自托管 MVC 5 项目

    嘿 您知道如何在桌面上没有本地 IIS 或 IIS Express 的情况下运行 MVC 5 项目吗 在 ASP NET vNext 中 有一个 WebListener 使这成为可能 但我无法将我的项目重新组织为 ASP NET vNext
  • “GridView1”触发了未处理的事件 PageIndexChanging

    我正在使用 gridview 我想使用分页 我已经将允许分页设置为 true 并将页面大小设置为 5 我可以看到 gridview 底部的数字 但是当我单击数字移动到相应页面时 它会抛出错误 The GridView GridView1 f
  • Windows Batch 中嵌套循环中的“继续”等效命令

    我有一个批处理文件 其中包含嵌套循环continue类似命令 for i in 1 2 4 8 16 32 64 128 256 do for j in 1 2 4 8 16 32 64 128 256 do if i gtr j goto
  • jdk1.7/jre/lib/rt.jar的访问限制

    大家好 我在创建 JAXB 解析器时遇到了一个非常奇怪的问题 当我尝试从 eclipse 生成 JAXB 类时 在一个类中它显示了一个非常奇怪的错误 即 Access restriction The type QName is not ac
  • 无法解析 org.tensorflow:tensorflow-lite:0.0.0-nightly

    我下载了最新的tensorflow lite demo 展示一下 Unable to resolve dependency for app debug compileClasspath Could not resolve org tenso
  • 可以阻止 Django 截断长表名吗?

    我将 Django 与现有的 Oracle 数据库 即表不是由 Django 创建的数据库 一起使用 因此 在我的模型中 我必须通过在 Meta 类中指定 db table 的值来指示表名称 我遇到了问题 因为我希望访问的表属于与我拥有凭据
  • 使用多个模板显示页面内容 - WordPress

    是否可以有这样的页面 www site com page 并使用以下命令显示不同的模板版本 www site com page template default www site com page template archive 因此它检
  • C++ 联合体、结构体、成员类型

    如果我有课 class Odp int i int b union long f struct WCHAR pwszFoo HRESULT hr 联合意味着 在列出的所有值中 它一次只能采用其中一个值 就访问这些变量而言 它是如何工作的 我
  • 如何在Python中的图像上打印印地语句子(unicode)?

    我有一个名为 hindi txt 的文件 其内容如下 我使用的是Python3 5 9 59000 Cr 36 WhatsApp Allo 10 150
  • 在 Cython 中分配中间多维数组而不获取 GIL

    我正在尝试使用 Cython 并行化涉及生成中间多维数组的昂贵操作 以下非常简化的代码说明了我正在尝试做的事情 import numpy as np cimport cython cimport numpy as np from cytho
  • 从 Windows NT 设备路径转换为驱动器号路径

    如何解析设备路径中带有驱动器号的路径 例如 转换 Device HarddiskVolume4 Windows System32 RuntimeBroker exe into C Windows System32 RuntimeBroker
  • 在 xml 文件中搜索数据的最佳方法?

    在我们的新项目中 我们必须提供搜索功能来从数百个 xml 文件中检索数据 下面我简要介绍了我们目前的计划 我想知道您对此的建议 改进 这些 xml 文件包含个人信息 搜索基于其中的 10 个元素 例如姓氏 名字 电子邮件等 我们当前的计划是
  • grep -f 的性能问题

    我正在使用 grep 在单个文件中搜索多个正则表达式 特别是 我正在考虑100 MB 文件 带英文字幕 https drive google com open id 0B3oOQ14 tellNzhlU0tKT2xFSW8并运行存储在文件中
  • ng-click 在 ag-grid 单元格内不起作用

    我正在使用 ag grid 我需要在单元格中添加一些自定义链接 并希望在其上调用 ng click 函数 这是我的代码 var columnDefs headerName ID field id headerName Template Na
  • 为什么赋值在 Angular 表达式中并不总是有效?

    我刚刚发现 Angular 表达式中允许的内容存在这种有趣的明显不一致 可以在表达式中执行赋值 如果赋值涉及 ngRepeat 中的局部变量 则会中断 这可以通过使用控制器中定义的 setter 而不是表达式中的赋值来克服 参见普朗克 ht
  • 从 SQL 列中选择特定字符

    我有列名BOOKNAME in BOOKS表可以包含除字母数字之外的许多特殊字符 例如 如何编写一个查询来仅显示所有行中的特殊字符并将它们联合起来 例如 Row number Book name 1 Alice inWonder Land
  • Xcode 4.5.2 是否自动在合成的 BOOL getters 前面添加 is 前缀

    我刚刚注意到我有一个 BOOL 声明为 property nonatomic assign BOOL userAuthorized 我正要为它编写自己的 getter 并自动 Xcode 自动完成 BOOL isUserAuthorized
  • C# 调用 C++ dll 获取 EntryPointNotFoundException

    我得到了一个 C dll 文件 一个lib文件和头文件 我需要从我的 C 应用程序中调用它们 头文件看起来像这样 class Clog class EXPORT MACRO NB DPSM private string sFileNameT
  • 在嵌套数组上使用 $unwind 的后果?

    假设我有 17 000 个文档 其结构类似于以下文档 someInfo blah blah blah and another dozen or so attributes here followed by answers email ema