当外字段是数组时 MongoDB 查找

2024-01-03

我搜索过互联网和 StackOverflow,但找不到答案,甚至找不到问题。

我有两个收藏,reports and users。我希望我的查询返回所有报告,并指示指定用户是否将该报告作为其数组中的最爱。

报告收集

{ _id: 1, name:"Report One"}
{ _id: 2, name:"Report Two"}
{ _id: 3, name:"Report Three"}

用户收藏

{_id: 1, name:"Mike", favorites: [1,3]}
{_id: 2, name:"Tim", favorites: [2,3]}

users.name="Mike" 的期望结果

{ _id: 1, name:"Report One", favorite: true}
{ _id: 2, name:"Report Two", favorite: false}
{ _id: 3, name:"Report Three", favorite: true}

我能找到的所有答案都在本地使用 $unwind (reports) 字段,但在本例中本地字段不是数组。外场就是数组。

国外的田野如何放松?有一个更好的方法吗?

我在网上看到有人建议再做一个合集favorites其中将包含:

{ _id: 1, userId: 1, reportId: 1 }
{ _id: 2, userId: 1, reportId: 3 }
{ _id: 3, userId: 2, reportId: 2 }
{ _id: 4, userId: 2, reportId: 3 }

这个方法看起来应该是没有必要的。连接到外部数组中的 ID 应该很简单,对吧?


您可以使用带有自定义管道的 $lookup https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#std-label-lookup-multiple-joins这会给你0 or 1结果然后使用$size https://docs.mongodb.com/manual/reference/operator/aggregation/size/index.html将数组转换为单个布尔值:

db.reports.aggregate([
    {
        $lookup: {
            from: "users",
            let: { report_id: "$_id" },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $and: [
                                { $eq: [ "$name", "Mike" ] },
                                { $in: [ "$$report_id", "$favorites" ] }
                            ]
                        }
                    }
                }
            ],
            as: "users"
        }
    },
    {
        $project: {
            _id: 1,
            name: 1,
            favorite: { $eq: [ { $size: "$users" }, 1 ] }
        }
    }
])

或者,如果您需要使用低于 3.6 的 MongoDB 版本,您可以使用常规版本$lookup然后使用$filter https://docs.mongodb.com/manual/reference/operator/aggregation/filter/index.html只获取那些用户name is Mike:

db.reports.aggregate([
    {
        $lookup: {
            from: "users",
            localField: "_id",
            foreignField: "favorites",
            as: "users"
        }
    },
    {
        $project: {
            _id: 1,
            name: 1,
            favorite: { $eq: [ { $size: { $filter: { input: "$users", as: "u", cond: { $eq: [ "$$u.name", "Mike" ] } } } }, 1 ] }
        }
    }
])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当外字段是数组时 MongoDB 查找 的相关文章

随机推荐

  • 在android webview中使用angularjs时如何禁用网络安全?

    我正在创建一个android应用程序 我想在其中使用angularjs在我的webview中显示html内容 它不能正常工作 我刚刚意识到我应该禁用网络安全选项 因为当我这样做时它在chrome中工作 有人能告诉我吗 我该怎么办 webVi
  • 聚合查询在 mongo 中有效,但在 Pymongo 中无效

    我遇到了一个问题 我尝试查询此文档以获取 COL 数组外部的 LOC 标识符的金额和分组总和 id ObjectId 57506d74c469888f0d631be6 LOC User001 COL date 25 03 2016 numb
  • 如何将 OAuth2 与 Node.js 结合使用

    我想使用 google cloud 客户端库将数据插入 BigQuery 由于我有多个客户端 并且每个客户端都有不同的 IAM 角色 因此我无法使用如下服务帐户 const bigquery new BigQuery projectId m
  • ScrollView 不显示整个 TableLayout

    我想显示一个TableLayout在一个ScrollView 该表有 9 个TableRow但ScrollView开始显示第四行的部分内容 我无法向上滚动查看上面的行 XML 布局
  • Cappuccino、Django、AJAX,并将它们组合在一起 - 回顾我的架构!

    我正在尝试了解卡布奇诺 我希望我的 StackOverview 同行审查下面的架构 看看它是否有意义 目的是利用 Django 和 Cappuccino 的独特优势 而无需在技术重叠的地方加倍 当 Web 浏览器请求 友好 URL 例如 a
  • 记住多个项目的已读/未读状态的最有效方法是什么?

    例如 我们采用论坛的格式 其中有多个用户和多个线程 假设该论坛想要跟踪哪些用户已阅读哪些线程 并在查看线程列表时使用该信息来标记哪些线程未读 我能想到的唯一解决方案是每次用户访问线程时将记录放入数据库中 我想可能有一个 将所有标记为已读 按
  • 保存字符串时 SharedPreferences nullPointerException

    我正在为 Android 工作启动器 目前我正在处理地址簿 是的 我想将其包含到我的启动器中 但我正在NullPointerException 这是我的主框架的一部分 其中调用了导致错误的类 Numbers j new Numbers Ed
  • Razor 对通用扩展方法的支持

    关于 Razor 视图引擎 假设我想渲染Html TextBoxFor
  • 在 PHP 中将指数转换为整数[重复]

    这个问题在这里已经有答案了 可能的重复 在php中将指数数转换为小数 https stackoverflow com questions 4461444 convert exponential number to decimal in ph
  • 如何清理精灵而不覆盖其他东西?

    我正在尝试在 pygame 中制作俄罗斯方块 并且发生了碰撞和移动 但是当遮罩与放置的块碰撞时 我用来覆盖旧精灵的矩形覆盖了放置的精灵的部分 def replace self pygame draw rect board surface 0
  • 如何实现iOS应用内购买动态价格图书?

    我开发了一个 iOS 应用程序 用户可以购买有声读物 从而可以在应用程序内进行流式传输和下载 我已经集成了 Authorize net 支付网关 被苹果拒绝了 说 11 2 使用应用内购买 API IAP 以外的系统来购买应用中的内容 功能
  • Symfony 5 security.interactive_login 事件未调用

    我想使用security interactive login更新我的用户的上次登录字段的事件 活动注册成功 php bin console debug event dispatcher security interactive login
  • 如何用Java计算Azure存储容器大小?

    虽然以下链接详细介绍了使用 C 计算存储大小的方法 但我在 Java 中没有看到类似的方法 如果有人可以发布 Java 示例代码 我将不胜感激 Azure 存储容器大小 https stackoverflow com questions 1
  • 如何获取 SQLite 数据库表中的列列表?

    我正在寻找检索表中的列列表 该数据库是最新版本的 SQLite 我相信是 3 6 我正在寻找使用 SQL 查询执行此操作的代码 与列相关的元数据的额外奖励点 例如长度 数据类型等 您要查找的内容称为数据字典 在 sqlite 中 可以通过查
  • xrange 与 itertools.count Python 2.7

    我想运行从开始值到结束值的范围 它在较小的数字上工作正常 但当它变得太大时 会导致溢出错误 因为 int 太大而无法转换为 C Long 我正在使用Python 2 7 3 我在这里读到OverflowError Python int 太大
  • 如何在Spring Data JPA中执行AND和多个OR参数方法

    我正在尝试为此查询制定方法名称 Query from Employees where department 1 and fullTime true or contractor true or subContractor true 我认为这种
  • 抑制 C 警告“未使用的变量 x”的最佳方法? [复制]

    这个问题在这里已经有答案了 抑制 C 编译器 例如 GCC 如 未使用的变量 x 警告的最佳 最巧妙的方法是什么 GCC 文档解释 Wunused 变量每当局部变量或非常量静态变量除了其声明之外未使用时发出警告 我不想给我的编译器任何特定的
  • py2exe:由于 DLL,编译的 Python Windows 应用程序将无法运行

    我承认我对 Python 还很陌生 而且我还不知道自己在做什么 最近 我使用 Python 2 6 2 和 wxPython 2 8 创建了一个非常小的 Windows 应用程序 而且效果很好 我对它正常运行的情况感到非常满意 通常我的意思
  • C - IF(char[] == "ZYX") 不起作用

    我从arduino发送到arduino字符串 I2C 捕获并保存到char 10 当我将此变量与文本进行比较时 条件没有执行 而且我不知道为什么 char dataRx 10 void DaemonReceiving int howMany
  • 当外字段是数组时 MongoDB 查找

    我搜索过互联网和 StackOverflow 但找不到答案 甚至找不到问题 我有两个收藏 reports and users 我希望我的查询返回所有报告 并指示指定用户是否将该报告作为其数组中的最爱 报告收集 id 1 name Repor