如何使用 mongodb 选择每个特定字段的记录数?

2023-11-29

我在 mongodb 中有一个文档集合,每个文档都有一个“组”字段,该字段引用拥有该文档的组。这些文件看起来像这样:

{
  group: <objectID>
  name: <string>
  contents: <string>
  date: <Date>
}

我想构建一个查询,返回每个组的最新 N 个文档。例如,假设有 5 个组,每个组有 20 个文档。我想编写一个查询,该查询将返回每个组的前 3 个文档,该查询将返回 15 个文档,每个组 3 个。每组得到 3 个,即使另一组有更新的第 4 个。

在 SQL 世界中,我相信这种类型的查询是通过“分区依据”和计数器完成的。 mongodb中有没有这样的事情,缺少对N个组进行N+1个单独的查询?


您还不能使用聚合框架来执行此操作 - 您可以获取每个组的 $max 或顶级日期值,但聚合框架还没有办法累积前 N 个,而且无法将整个文档推送到结果集中(仅限个别字段)。

所以你必须依靠 MapReduce。这是可行的,但我确信有很多变体(都需要以某种方式根据特定属性对对象数组进行排序,我从其中一个借用了我的解决方案这个问题的答案.

Map 函数 - 输出组名称作为键,文档的整个其余部分作为值 - 但它将其输出为包含数组的文档,因为我们将尝试累积每个组的结果数组:

map = function () { 
    emit(this.name, {a:[this]}); 
}

reduce 函数会将属于同一组的所有文档累积到一个数组中(通过 concat)。请注意,如果您通过检查日期来优化reduce以仅保留前五个数组元素,那么您将不需要finalize函数,并且在运行mapreduce期间将使用更少的内存(它也会更快)。

reduce = function (key, values) {
    result={a:[]};
    values.forEach( function(v) {
        result.a = v.a.concat(result.a);
    } );
    return result;
}

由于我保留每个键的所有值,因此我需要一个 Finalize 函数来仅提取每个键的最新五个元素。

final = function (key, value) {
      Array.prototype.sortByProp = function(p){
       return this.sort(function(a,b){
       return (a[p] < b[p]) ? 1 : (a[p] > b[p]) ? -1 : 0;
      });
    }

    value.a.sortByProp('date');
    return value.a.slice(0,5);
}

使用与您提供的模板文档类似的模板文档,通过调用 mapReduce 命令来运行它:

> db.top5.mapReduce(map, reduce, {finalize:final, out:{inline:1}})
{
    "results" : [
        {
            "_id" : "group1",
            "value" : [
                {
                    "_id" : ObjectId("516f011fbfd3e39f184cfe13"),
                    "name" : "group1",
                    "date" : ISODate("2013-04-17T20:07:59.498Z"),
                    "contents" : 0.23778377776034176
                },
                {
                    "_id" : ObjectId("516f011fbfd3e39f184cfe0e"),
                    "name" : "group1",
                    "date" : ISODate("2013-04-17T20:07:59.467Z"),
                    "contents" : 0.4434165076818317
                },
                {
                    "_id" : ObjectId("516f011fbfd3e39f184cfe09"),
                    "name" : "group1",
                    "date" : ISODate("2013-04-17T20:07:59.436Z"),
                    "contents" : 0.5935856597498059
                },
                {
                    "_id" : ObjectId("516f011fbfd3e39f184cfe04"),
                    "name" : "group1",
                    "date" : ISODate("2013-04-17T20:07:59.405Z"),
                    "contents" : 0.3912118375301361
                },
                {
                    "_id" : ObjectId("516f011fbfd3e39f184cfdff"),
                    "name" : "group1",
                    "date" : ISODate("2013-04-17T20:07:59.372Z"),
                    "contents" : 0.221651989268139
                }
            ]
        },
        {
            "_id" : "group2",
            "value" : [
                {
                    "_id" : ObjectId("516f011fbfd3e39f184cfe14"),
                    "name" : "group2",
                    "date" : ISODate("2013-04-17T20:07:59.504Z"),
                    "contents" : 0.019611883210018277
                },
                {
                    "_id" : ObjectId("516f011fbfd3e39f184cfe0f"),
                    "name" : "group2",
                    "date" : ISODate("2013-04-17T20:07:59.473Z"),
                    "contents" : 0.5670706110540777
                },
                {
                    "_id" : ObjectId("516f011fbfd3e39f184cfe0a"),
                    "name" : "group2",
                    "date" : ISODate("2013-04-17T20:07:59.442Z"),
                    "contents" : 0.893193120136857
                },
                {
                    "_id" : ObjectId("516f011fbfd3e39f184cfe05"),
                    "name" : "group2",
                    "date" : ISODate("2013-04-17T20:07:59.411Z"),
                    "contents" : 0.9496864483226091
                },
                {
                    "_id" : ObjectId("516f011fbfd3e39f184cfe00"),
                    "name" : "group2",
                    "date" : ISODate("2013-04-17T20:07:59.378Z"),
                    "contents" : 0.013748752186074853
                }
            ]
        },
        {
            "_id" : "group3",
                        ...
                }
            ]
        }
    ],
    "timeMillis" : 15,
    "counts" : {
        "input" : 80,
        "emit" : 80,
        "reduce" : 5,
        "output" : 5
    },
    "ok" : 1,
}

每个结果都将 _id 作为组名称,将值作为该组名称集合中最近五个文档的数组。

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

如何使用 mongodb 选择每个特定字段的记录数? 的相关文章

  • mongodb在windows下无法启动?

    当我尝试在命令行上使用命令 mongod exe 启动 mongodb 时 它会抛出以下错误 C mongodb win32 x86 64 2 0 6 bin gt mongod exe mongod exe help for help a
  • 如何获取 bson 文档的大小(以字节为单位)

    bson文档的size 函数返回的int值是字节数吗 无法找到此 API 的详细信息 如何获取 bson 文档的大小 以字节为单位 这是我的代码 import org bson Document MongoDatabase db Mongo
  • 带有卷的 docker 中的 Mongo db 持久化

    我正在尝试创建一个 mongo 数据库容器 但无法使数据持久化 这是我的 docker compose yml version 3 2 services mongodb image mongo 2 4 command smallfiles
  • Mongodb 限制聚合查询中的数组

    我正在尝试编写一个查询来返回每个类别中的前 X 个术语 例如前 5 个 前 10 个等 每个术语都有一个关联的类别 并且基于另一个术语的帮助堆栈溢出问题 https stackoverflow com questions 25666187
  • MongoDB自增ID

    MongodB 中自动生成的 ID 的大小为12 Bytes大整数的大小是8 bytes 我在 4 台运行 Ubuntu Server 的机器上有一个 mongodb 集群 但我现在只是在测试 插入只能通过一台服务器 即 Nodejs 服务
  • Mongodump之后,调用MongoRestore挂起

    我们正在尝试在相对较小的数据库上做一个简单的 MongoDump 我们的步骤很简单 export 从目标机器上删除现有数据库 在目标机器上导入 MongoDump 完美执行 mongodump out root mongo prod DB
  • 使用 Tweepy 获取推文时出错

    我有一个用于获取推文的 Python 脚本 在脚本中我使用该库 Tweepy 我使用有效的身份验证参数 运行此脚本后 一些推文存储在我的 MongoDB 中 有些则被 if 语句拒绝 但我仍然收到错误 requests packages u
  • 获取对象数组中每个嵌套对象的虚拟属性?

    所以我知道如何获取单个虚拟属性 如 Mongoose 文档中所述 PersonSchema virtual name full get function return this name first this name last 但如果我的
  • Mongoose.js instance.save() 回调未触发

    var mongo require mongoose var connection mongo createConnection mongodb 127 0 0 1 test connection on error function err
  • 使用 PHP 从 Mongo 解码 JSON

    我已经看过这个线程 PHP 解码嵌套 JSON https stackoverflow com questions 3555335 php decode nested json并没有设法用它来解决我的问题 我目前正在从 Mongo 获取 J
  • MongoDB 过滤嵌套对象中的数组元素

    我有一个文件如下 id ObjectId 56423b2558cb340599108b35 test source member abc member xyz 我想过滤数组元素 xyz 并且我正在尝试以下查询 db coll find te
  • 如何在 Spring-data 中更改/定义 Mongodb 的默认数据库?

    我有从 MongoRepository 扩展的接口 他们使用默认数据库 mongodb 我想定义类的数据库名称 public interface CustomerRepository extends MongoRepository
  • Ubuntu 上的 MongoDB 不会作为服务启动,日志中没有任何内容

    我正在 Ubuntu 上运行 MongoDB 2 2 如果我运行 sudo mongod 我得到一个错误 它找不到 data db 这不是数据库所在的位置 在 mongod conf 中 数据库路径被指定为 Ubuntu 10gen 默认值
  • 在 React 应用程序中简单连接到 mongodb

    我使用 create react app 创建了简单的反应应用程序 这个应用程序包含表单 验证和引导程序 没有什么花哨的东西能像魅力一样发挥作用 我还注册了 mongo 以获得免费集群 以便我可以发送一些数据 所以我有这个网址 mongod
  • mongodb从不同数据库中选择

    我有大约 200 个 mongodb 数据库 每个数据库都有一个名为 Group 的集合 在该集合中有一个名为 meldingId 的字段 是否可以进行一个 mongodb 查询来查找不同数据库中的所有值 我设法通过 selectDB da
  • MongoRepository动态查询

    我有以下问题 假设我有以下模型对象 class Person String id String firstName String lastName Map
  • mongodb 和 pymongo 文档大小 16Mb 限制

    我正在使用 Windows 上的 showIncludes 标志和 nix 上的 H 标志来分析构建中的包含内容 我正在用 python 脚本解析这些信息 包含的每个文件都变成一个对象 列出其子文件 它包含的文件 和祖先 包含该文件的包含路
  • 使用 Java 为 MongoDB 中的外部值分配权重

    这就是我如何创建具有不同权重的索引蒙戈外壳 db blog ensureIndex content text keywords text about text weights content 10 keywords 5
  • UnhandledPromiseRejectionWarning: MongoError: w 必须是连接处的数字或字符串

    任何人都知道为什么我会收到此错误 UnhandledPromiseRejectionWarning MongoError w 必须是连接处的数字或字符串 我在运行下面的代码时遇到此错误 它的目的是检查用户是否在 mongodb 数据库中 如
  • 使用 MongoDB 作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

    我们目前正在为一家专业公司内部实施类似 CRM 的解决方案 由于存储信息的性质以及信息的不同值和键 我们决定使用文档存储数据库 因为它完全适合目的 在本例中我们选择 MongoDB 作为此 CRM 解决方案的一部分 我们希望存储实体之间的关

随机推荐

  • 复制 Excel 单元格数据直到列中最近的填充单元格

    我是 Excel 的新手 我面临一些问题 我有一个 Excel 工作表 必须将其导入到我的另一个程序中 请考虑以下格式 Heading1 Sub heading1 Sub Sub heading1 Sub Sub heading2 Sub
  • Ruby 数组注入

    我试图使用注入方法记录 10 个线程的平均运行时间 但它给了我这个错误 undefined method for
  • 将文件从 URL 传输到 Cloud Storage

    我是一名 Ruby 开发人员 尝试使用 Python 编写的 Google Cloud Functions 但在将远程文件从给定 URL 传输到 Google Cloud Storage GCS 时遇到了困难 在等效的 RoR 应用程序中
  • 如何使用 android.mk 将 .aar 包含在 AOSP 中

    我需要在 aosp 构建树中使用 android mk 构建一个应用程序 我有一个自定义的 arr lib 它位于以下文件夹 apps libs mylib aar 中 任何人都可以告诉我如何将 aar 包含在 android aosp 构
  • 将“工作集”装入 MongoDB 的 RAM 意味着什么?

    MongoDB 很快 但前提是您的工作集或索引可以放入 RAM 那么 如果我的服务器有 16G RAM 这是否意味着我所有集合的大小都需要小于或等于 16G 如何说 好吧 这是我的工作集 其余的可以 存档 工作集 基本上是系统将处于活动状态
  • MVC模型验证

    因此 我当前正在构建一个需要用户模型验证的应用程序 如果向用户填写了不正确的属性 它会告诉他们 我已设置数据注释 但我不确定如何将错误消息转发回用户 到目前为止 我已经在我的模型和视图上进行了设置 Model public class Da
  • setNamedRange() 在电子表格容器之外?

    我已经尝试了尽可能多的组合 我的目标是让 Google Apps 脚本独立运行或从库中运行 并能够在电子表格中设置命名范围 据我所知 setNamedRange 方法仅在电子表格容器内可用 并且仅当您使用SpreadsheetApp get
  • Teams:Invoke-Webrequest 向 Teams 发送 base64 字符串 (png)

    我正在尝试将一个 png 格式的 base64 字符串发送到我们的团队频道 该频道具有 传入 Webhook 设置 消息已发送到频道 但没有显示图像 当我搜索此内容时 似乎无法将图像或任何其他类型的附件作为 base64 字符串发送到 Te
  • 在python中动态添加@property

    我知道我可以通过执行以下操作动态地将实例方法添加到对象 import types def my method self logic of method instance is some instance of some class inst
  • Win32 GUI 在调整大小时闪烁

    我有一个带有选项卡控件的 Win32 GUI 程序 每个选项卡都有一个列表视图控件 每当调整窗口大小时都会出现大量闪烁 我尝试过以下操作 在主 wndproc 中处理 WM ERASEBKGND 并返回 TRUE 没有效果 过滤掉事件循环中
  • 当UAC打开时,程序可以在没有管理员权限的情况下写入磁盘的根目录吗?

    如果我不是管理员并启动一个写入 C 某些文本文件的程序 在 Windows 7 或 Vista 中我是否需要管理员权限 我发现在 XP 中写入任何文件夹 包括 system32 都没有问题 但我不确定 NET 中的程序是否能够在没有管理员权
  • 与文本字段和日期选择器相关的问题

    我有一个与单击文本字段时隐藏和显示日期选择器视图相关的问题 实际上我有 2 个文本字段 这是我的问题图像 Problem 单击文本字段时日期选择器显示和隐藏 它应该在开始编辑时显示并在结束编辑时隐藏 当我们第一次点击 textfield 1
  • 在 LinearLayout 中动态创建多个 TextView

    我想创建多个TextView里面有一个LinearLayout 以下代码构建成功 但给出了NullPointerException在线上root addView t i public class MainActivity extends A
  • 创建通用 TypeScript 函数,为对象属性赋值

    我想创建一个简单的函数key特定对象的和value为相应的键并将新值分配给对象 像这样的东西 interface MyObject key1 string key2 number const object MyObject key1 abc
  • flex-grow 和 width 有什么区别?

    我最近开始使用 Flexbox 经常会出现需要在元素之间的主轴上分配空间的情况 我常常犹豫不决width and flex grow 例如 如果我希望一项测量 2 个测量 另一个测量 1 个测量 加起来为 100 我有两种选择 我可以设置w
  • UIScrollView 内的 UITextView 与 AutoLayout

    我试图将 UITextView 放置在带有 AutoLayout 的 UIScrollView 中 但没有成功 我尝试过的是 我将 UIScrollView 放置在 Storyboard 的主视图中 我将 UITextView 放置在 St
  • Libclang 的 python 绑定生成的 AST 无法解析 C++ 源代码中的某些标记

    我正在使用 Libclang 的 python 绑定 我基本上有两个疑问 我想知道我们如何解析既不是用户定义的也不是包含库的库函数 例如当我有以下源代码时 char a char malloc 4 Libclang 无法解析 malloc
  • 停止缓存 jQuery .load 响应

    我有以下代码对 URL 发出 GET 请求 searchButton click function inquiry load portal f searchBilling pid query val 但返回的结果并不总是能反映出来 例如 我
  • 当指针类型不同时如何生成编译错误?

    当两个指针 a 和 b 具有不同的基类型时 如何编写一个宏 CHECK a b 来生成编译错误 CHECK int 0 char 0 gt compilation error CHECK int 0 int 0 gt works 我正在寻找
  • 如何使用 mongodb 选择每个特定字段的记录数?

    我在 mongodb 中有一个文档集合 每个文档都有一个 组 字段 该字段引用拥有该文档的组 这些文件看起来像这样 group