MongoDB聚合项目检查数组是否包含

2024-01-26

我有以下文件:

{
    _id : 21353456,
    username : "xy",
    text : "asdf",
    comments : [
        {
            username : "User1",
            text : "hi",
        },
        {
            username : "User2",
            text : "hi1",
        },
        {
            username : "User3",
            text : "hi2",
        },
        {
            username : "User4",
            text : "hi3",
        }

    ]
}

现在我想获取用户名、文本和评论以及聚合和项目。此外,如果评论数组包含带有“User1”的用户名,我还想要一个布尔值。我有这个,但是不起作用。

db.posttest.aggregate(
   [
     {
       $project:
          {
            username: 1,
            text: 1,
            comments : 1,
            hasComment: { $eq: [ "comments.$.username", "User1" ] },
            _id: 0
          }
     }
   ]
)

要实现这一目标,您需要首先unwind评论,然后使用group有一个小技巧。如果您想省略_id,那么您还需要做一个简单的项目。这是完整的聚合管道:

db.posttest.aggregate([
  { $unwind : "$comments" },
  { $group : {
    _id : "$_id",
    username : { $first : "$username" },
    text : { $first : "$text" },
    comments : { $push : "$comments" },
    hasComments : { $max : { $eq : [ "$comments.username", "User1" ] } }
  }},
  { $project : { _id : false } }
])

解释如下。

首先,我们需要删除一个数组(comments)。为此,我们展开记录;它给了我们四个记录:

{
  "_id" : 21353456,
  "username" : "xy",
  "text" : "asdf",
  "comments" : {
    "username" : "User1",
    "text" : "hi"
  }
},
{
  "_id" : 21353456,
  "username" : "xy",
  "text" : "asdf",
  "comments" : {
    "username" : "User2",
    "text" : "hi1"
  }
},
{
  "_id" : 21353456,
  "username" : "xy",
  "text" : "asdf",
  "comments" : {
    "username" : "User3",
    "text" : "hi2"
  }
},
{
  "_id" : 21353456,
  "username" : "xy",
  "text" : "asdf",
  "comments" : {
    "username" : "User4",
    "text" : "hi3"
  }
}

现在我们可以将所有记录分组为一个,对每个字段应用一个函数。首先,我们需要给出标准,即“分组依据”字段(或字段集)。在我们的例子中,它只是 id:_id: "$_id".

然后,对于每个字段,我们需要决定如何将其包含到结果记录中。我们有几个字段:username, text, and comments。对于每四个记录,用户名和文本都是相同的,因此我们可以轻松选择其中任何一个,即$first or $last.

comments然而,情况有所不同。我们希望保护所有这些,以便我们$push各一回来。

The hasComments这里有点棘手:我们需要检查是否至少有一个comment.username包含用户名。我们可以用$eq: [...]在这里,它会给我们一些数组,例如[true, false, false, false] or [false, false, true, false]。我们需要选择将哪个值放入结果记录中。在这种情况下,我们不能使用$first nor $last。然而,$max会给我们一个合适的结果。

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

MongoDB聚合项目检查数组是否包含 的相关文章

  • 如何对MongoDB子文档中的每个字段求和?

    当我在 MongoDB 中使用 db collection aggregate 时遇到问题 我有一个像这样的数据结构 id Segment S1 1 S2 5 Sn 10 这意味着以下内容Segment 我可能有几个带有数值的子属性 我想将
  • 有没有办法将unix格式的时间戳显示为ISODate?

    我们在MongoDB中使用unix时间戳存储了一个日期 当我进行查询时如何获取日期 有没有办法以 ISODate 格式显示时间戳 背景 A unixtime http en wikipedia org wiki Unixtime值代表sec
  • MEAN 堆栈文件上传

    我最近开始使用 MEAN Stack 进行编程 目前正在实现某种社交网络 一直使用 MEAN io 框架来做到这一点 我现在的主要问题是让文件上传正常工作 因为我想做的是将文件从表单接收到 AngularJS 控制器中 并将其与更多信息一起
  • MongoDB list集合过滤器

    我正在使用 Node js 我正在尝试过滤必须排除集合 出口 的集合并检索所有其他集合 但我似乎无法弄清楚语法 我试过了 db listCollections filter outlets toArray err docs 有什么建议么 您
  • 为什么 mongo 的状态会抛出异常(code = exited,status = 48)?

    我在使用 mongo 时遇到了极其缓慢的情况 早些时候 当我输入 sudo systemctl status mongodb mongo 时 我出现在线并且呈绿色 现在几天后他开始抛弃我 mongodb service High perfo
  • 如何将 json 字符串编组到 bson 文档以写入 MongoDB?

    我正在寻找的东西相当于文档 parse https api mongodb com java 3 2 org bson Document html parse java lang String 在golang中 这允许我直接从json创建b
  • 删除时忽略限制(猫鼬)

    我需要删除集合中最早的几个文档 所以我写了这样的内容 Model remove u abc sort id 1 limit 10 exec function err count count gives the total documents
  • 合并两个 $or 语句

    我正在尝试执行一个由两个组成的查询 or s Date1 Date2 NULL NULL NULL TODAY NULL TOMRW TODAY TODAY TODAY NULL TOMRW NULL 我已经标记了与星号匹配的行 Date1
  • MongoDB 添加以变量值命名的新字段

    我的问题是 鉴于像这样的文件很少 deliveryDay 2021 01 14 plate name pasta quantity 1 deliveryDay 2021 01 16 plate name pasta quantity 3 d
  • 有没有办法限制特定集合中的记录数量

    假设我插入以下记录 例如 foo1 foo2 foo3 foo4 foo10 我希望该集合在任何时间点仅保留 5 条记录 例如 它可能是 foo1 foo5 或 foo2 foo6 或 foo6 foo10 我应该如何实现这个目标 听起来您
  • 如何使用 pollingThrottle 和 pollingInterval?

    所以我的应用程序中有一些东西我不需要立即反应并找到有关属性的信息轮询节流阀 and 轮询间隔在文档中 所以这里基本上是我设法找到的有关这些属性的所有信息 pollingIntervalMs 数 仅限服务器 在服务器上观察时轮询此查询的频率
  • Mongoose 中的分组(依据)?

    我已经在 shell 中构建了我想要的查询 但在 Mongoose 中编写它时遇到了问题 db commentstreams group key page id true reduce function obj prev prev num
  • 使用 MongoDB PHP 驱动程序时的安全问题

    我有在 MYSQL 上保护 sql 注入的经验 但是在使用 php 驱动程序的 MongoDB 上我应该注意什么 在大多数页面中 我通过 GET POST 和搜索 插入系统获取数据 我通过 UDID 其他字段进行搜索 并且可以插入任何字符串
  • 如何修改副本集配置?

    我正在运行一个 mongo 2 节点集群 并使用此副本集配置 config id repl1 members id 0 host localhost 15000 id 1 host 192 168 2 100 15000 我必须将这两个节点
  • node-mongodb-native MongoClient 意外关闭连接

    我一直在 mongodb 中搜索大量意外关闭的连接 但只能找到希望关闭连接的人提出的问题 我正在使用 node mongodb native 连接到数据库 但我不断收到看似随机的 错误 连接已关闭 消息 如果我手动重试请求 浏览器刷新 则请
  • Mongo 可审核的 ZonedDateTime 字段在 Spring Boot 2 中不起作用

    在 Spring Boot 项目中 我使用 CreatedDate 之类的注释来保存有关创建 更新相应文档的日期的信息 整个项目都使用 ZonedDateTime 因此带注释的字段也是 ZonedDateTime 为了实现 Mongo 的日
  • 如何在Spring Boot中初始化一次MongoClient并使用它的方法?

    您好 我正在尝试导出MongoClient在 Spring Boot 中成功连接后 我尝试在其他文件中使用它 这样我就不必每次需要在 MongoDB 数据库中进行更改时都调用该连接 连接非常简单 但目标是将应用程序连接到我的数据库一次 然后
  • 在原子操作中测试和递减?

    我刚刚发现了一个恼人的错误 它基本上是一个竞争条件 为了便于论证 我们假设一个非常简单的文档结构 例如 id XXX amount 100 集合中存在数百个这样的文档 并且由多个编写器访问 这些编写器有效地尝试将数量降低任何值 但绝不会低于
  • MongoDB 的简单 HTTP/TCP 健康检查

    我需要为 Docker 容器内的 MongoDB 实例创建运行状况检查 尽管我可以采取解决方法并通过 CLI 使用 Mongo Ping 但最好的选择是创建一个简单的 HTTP 或 TCP 测试 标准 ping 测试中默认 27017 端口
  • MongoDb 如何按月和年聚合

    我是 mongodb 新手 正在尝试学习 MongoDB 查询 id ObjectId 59815d4704ca1760a45957ca userEmail email protected cdn cgi l email protectio

随机推荐

  • 如何在 ruby​​ on Rails 应用程序中使用 CSS?

    如何将 CSS 与 RoR 结合使用 当我链接到外部时 我永远无法看到这些文件 我将 css 文件复制到我能想到的每个文件夹中 视图 控制器 模板 但似乎没有任何效果 我需要做什么才能使用 Rails 应用程序启用外部 CSS 文件 我是
  • 我如何显式清除字节[]

    我正在创建新的字节数组 这些数组不被 GC 收集 并且存在于内存中并增加私有字节 下面的代码每 10 秒执行一次 使用完变量后如何显式清除该变量 byte outputMessage new byte 10000 Do some work
  • Django:当通过 ModelForm 创建帖子时如何将用户与创建的帖子相关联

    我创建了一个普通的 Django 帖子应用程序 它基本上让用户创建帖子及其内容 现在的问题是我将创建帖子表单实现为ModelForm在 forms py 中 现在如果不是ModelForm只是一个 html 表单 我会使用request P
  • 如果我使用“CreateObject()”设置变量,使用后是否需要通过将其设置为“Nothing”来清理它?

    如果我使用设置变量CreateObject 我是否需要通过将其设置为来清理它Nothing使用后 Dim foo Set foo CreateObject SomeAssembly foo Bar Set foo Nothing 我刚刚发现
  • Python(scikit learn)lda 崩溃为单一维度

    总的来说 我对 scikit learn 和机器学习非常陌生 I am currently designing a SVM to predict if a specific amino acid sequence will be cut b
  • 使用 auto_now_add 时如何让现有条目为空?

    我在现有模型中添加了一个字段 creation date models DateTimeField auto now add True blank True null True makemigrations 后的结果文件看起来像 migra
  • Android 中花哨的动态列表:TableLayout 与 ListView

    需要有一个不那么简单的动态列表 其中每个记录由几列 文本 按钮 组成 它应该看起来像 Text11 Text12 Button1 Button2 Text21 Text22 Button1 Button2 起初 实现这一目标的明显方法似乎是
  • Laravel 5.1 随机删除会话数据

    我的 Laravel 5 1 应用程序遇到一个奇怪的问题 它间歇性地丢弃会话数据 我通过编写一些中间件来检测到这一点 该中间件将该请求的会话内容写入日志文件 虽然会话 ID Session getId 不变 其值 token在检索到的会话数
  • NPM安装错误

    我尝试安装 browserify npm 模块 我收到以下错误 praful ubuntu terminalcloud npm install g browserify npm http GET https registry npmjs o
  • Servlet 会话无效

    我在 2 个不同的服务器上有 2 个应用程序 Tomcat 基本上是 WAR 文件 和 jBoss 中的 EAR EAR 是一个可重用的应用程序 我将在其中对用户进行身份验证并将控件发送回 Tomcat 上的应用程序 在进行身份验证时 我在
  • 从带有转场的 unix 命令行图像创建视频

    我发现了几个有关如何从图像创建视频的问题及其答案 我设置了其中两个并能够正确生成视频 我尝试了以下方法 图像魔术师转换 延迟 100 质量 75 photo1 jpg photo2 jpg movie mpg FFMPEGffmpeg r
  • RedisSessionStateProvider 错误未知命令“EVAL”

    当我在本地运行 Microsoft Web Redis RedisSessionStateProvider 时 出现以下错误 StackExchange Redis RedisServerException ERR unknown comm
  • 如何用正数和负数来计算增长?

    我正在尝试用正数和负数计算 Excel 中的增长百分比 This Year s value 2434 Last Year s value 2 我使用的公式是 This Year Last Year Last Year 2434 2 2 问题
  • .net core 中是否有任何公共 MemberNotNull/MemberNotNullWhen 属性

    不久前我读过以下关于C 8中可空引用分析的文章 https www meziantou net csharp 8 nullable reference types htm https www meziantou net csharp 8 n
  • 在查询字符串中将隐藏字段从一个页面传递到另一页面

    我想通过查询字符串将隐藏字段中的查询从一页传递到另一页 谁能帮我理清逻辑吗 值得花时间学习jQuery http jquery com 它并不是很复杂 并且使得编写 javascript 变得更加容易 还有很多 jQuery 插件 例如jq
  • SOA 中的循环依赖

    我猜这是一个常见问题 但我会尝试描述我当前的问题 我有一个基本服务 我们将其命名为 CoreService 它提供了我想说的 主要 功能 处理数据库中的数据 我们的应用程序中有一个集中式数据库 还有许多其他应用程序 其中一些应用程序有自己的
  • 如何使用 TortoiseSVN 进行分支和合并? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 你怎么分支和合并 http svnb
  • 使 Box2d 对象遵循预定路径

    我正在制作一个游戏 其中某个对象 建模为 box2d 主体 必须遵循固定路径 有没有一种方法可以指定路径坐标并使对象在每个 dt 上前进 Thanks 另外一个选择 将鼠标关节连接到您的身体上 使用鼠标关节的setTarget方法来移动身体
  • 枚举常量特定的类体是静态的还是非静态的?

    我有一个枚举类型类 public enum Operation PLUS Override double apply double x double y ERROR Cannot make a static reference to the
  • MongoDB聚合项目检查数组是否包含

    我有以下文件 id 21353456 username xy text asdf comments username User1 text hi username User2 text hi1 username User3 text hi2