当外字段是数组时 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 查找 的相关文章

  • Mongoose 多个连接

    目前我的连接有这个代码猫鼬 js var mongoose require mongoose var uriUtil require mongodb uri var mongodbUri mongodb localhost db name
  • MongoDB - 编辑器变量 - MongoDB shell - Windows 7

    EDITOR 变量功能真的可以在 Windows 7 上使用吗 我正在读一篇文章 说一旦我们设置了 EDITOR 变量在 mongorc js 中 我们只需在 shell 中输入 编辑变量名 and var name将被加载到编辑器中 在我
  • 如何减少嵌套文档聚合管道中的展开阶段?

    我是 mongodb 新手 正在尝试使用嵌套文档 我有一个查询如下 db EndpointData aggregate group id EndpointId RequestCount sum 1 FirstActivity min Dat
  • Mongodb upsert 嵌入文档

    我每天每米有一份文件 如果它不存在 如何在数据数组中添加另一个子文档并创建整个文档 key 20120418 123456789 data Meter 123456789 Dt ISODate 2011 12 29T16 00 00 0Z
  • 聚合和展开数组,但保留顶级键

    假设我的收藏中有以下文档Classes收藏家 id ObjectId 5df58d45244a850d54b922c8 mentors numOfMentors NumberInt 1 mentorList ObjectId 5c9ba63
  • 检索 mongoDB 文档中的空数组或 null

    我有我学校所有学生的收藏 每个文档都有一个sports列出每个学生从事的运动的数组属性 但该属性可能显示为sports or sports null或者根本不出现 如何检索属于上述三种情况之一的所有文件 如何向只有一项运动但未表示为数组的学
  • 如何更改 MongoDB 用户权限?

    例如 如果我有这个用户 gt db system users find user testAdmin pwd some hash roles clusterAdmin otherDBRoles TestDB readWrite 我想给那个用
  • 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更新很多

    我正在使用express js 和 npm 模块 mongodb 进行开发 并以 mongodb 作为数据库 我有两个集合 即 用户 和 活动 一个用户可能有数千个活动 首先 我将用户的 id 姓名和图片 url 存储到 关系的活动文件 请
  • MongoDB自增ID

    MongodB 中自动生成的 ID 的大小为12 Bytes大整数的大小是8 bytes 我在 4 台运行 Ubuntu Server 的机器上有一个 mongodb 集群 但我现在只是在测试 插入只能通过一台服务器 即 Nodejs 服务
  • Mongodb - 为现有集合添加架构

    我的 MongoDB 中有一个包含 1300 万条记录的集合 不幸的是 当我创建这个集合时 没有为其创建模式 我想知道除了备份整个数据库 创建架构并上传所有数据之外 是否有任何方法可以添加 JSON 架构 您可以使用以下方法将 JSON 架
  • 使用 Tweepy 获取推文时出错

    我有一个用于获取推文的 Python 脚本 在脚本中我使用该库 Tweepy 我使用有效的身份验证参数 运行此脚本后 一些推文存储在我的 MongoDB 中 有些则被 if 语句拒绝 但我仍然收到错误 requests packages u
  • Pymongo 批量插入

    我正在尝试批量插入文档 但批量插入时不会插入超过 84 个文档 给我这个错误 in insert pymongo errors InvalidOperation cannot do an empty bulk insert 是否可以批量插入
  • 使用 Mongoose 无法找到按 ObjectId 搜索的文档

    Campaign find client id req param client id error campaigns gt if error response error error message else for campaign i
  • findAndModify - MongoError:异常:必须指定删除或更新

    我想更新一个数组并返回文档 我的 findAndModify 语法正确吗 this becomeFollower function title username callback use strict posts findAndModify
  • 如何在 Spring-data 中更改/定义 Mongodb 的默认数据库?

    我有从 MongoRepository 扩展的接口 他们使用默认数据库 mongodb 我想定义类的数据库名称 public interface CustomerRepository extends MongoRepository
  • 如何在java中使用$lookup阶段与spring data mongodb? [复制]

    这个问题在这里已经有答案了 到 Spring 的最新版本 我已经看到很多堆栈溢出问题 这表明 spring data mongodb 中不支持此操作新的 spring data mongodb 1 10 0 中是否支持此操作 db orde
  • 自动执行异步函数

    下面的代码可以完美运行 const Course mongoose model Course courseSchema async function foo const nodeCourse new Course name Node JS
  • 如何在 Meteor 应用程序之间共享 MongoDB 集合?

    我希望能够为我的项目提供一个管理应用程序和一个客户端应用程序 理想情况下 我希望能够拥有一个共享的 MongoDB 集合 我怎样才能做到这一点 我尝试在两个不同的应用程序中创建具有相同名称的集合 但发现 Meteor 会将数据分开 知道我能

随机推荐

  • 在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