数据库引用

2023-10-27


进入MongoDB中文手册(4.2版本)目录

对于MongoDB中的许多用例,将相关数据存储在单个文档中的非规范化数据模型将是最佳的。但是,在某些情况下,将相关信息存储在单独的文档中(通常存储在不同的集合或数据库中)是有意义的。

重要
MongoDB 3.2引入了$lookup管道阶段,以对同一数据库中的未分片集合执行左外部联接。有关更多信息和示例,请参见$lookup
从MongoDB 3.4开始,您还可以使用$graphLookup 管道阶段来加入未分片的集合以执行递归搜索。有关更多信息和示例,请参见 $graphLookup

本页面概述了在$lookup和$graphLookup管道阶段之前的替代程序。
MongoDB应用程序使用以下两种方法之一来关联文档:

  • 手动引用,您可以将一个文档的_id字段保存在另一文档中作为引用。然后,您的应用程序可以运行第二个查询从而返回相关数据。这些引用对于大多数用例而言都是简单且足够的。
  • 数据库引用(DBRef),使用第一个文档的_id字段,集合名称以及(可选)其数据库名称的值来表示从一个文档到另一个文档的引用。通过包含这些名称,数据库引用可以使位于多个集合中的文档更易于与单个集合中的文档链接。
    若要解析数据库引用,您的应用程序必须执行其他查询从而返回引用的文档。许多驱动程序都有帮助器方法,这些方法会自动形成对数据库引用的查询。驱动程序不会自动将1数据库引用解析为文档。
    数据库引用提供了一种通用的格式和类型来表示文档之间的关系。如果数据库必须与多个框架和工具进行交互,则数据库引用格式还提供了表示文档之间链接的通用语义。

除非您有令人信服的理由使用数据库引用,否则请改为使用手动引用。

1 手动引用

1.1 背景

使用手动引用是一种将一个文档的 _id字段包含在另一文档中的做法 。然后,应用程序可以根据需要发出第二个查询来解析引用的字段。

1.2 程序

考虑以下操作,使用第一个文档的_id字段作为第二个文档的引用来插入两个 文档:

original_id = ObjectId()

db.places.insert({
    "_id": original_id,
    "name": "Broadway Center",
    "url": "bc.example.net"
})

db.people.insert({
    "name": "Erin",
    "places_id": original_id,
    "url":  "bc.example.net/Erin"
})

然后,当查询从people集合中返回文档时,您可以根据需要再次查询places集合中places_id字段所引用的文档。

1.3 使用

对于您希望在两个文档之间存储关系的几乎每种情况,请使用手动引用。引用很容易创建,您的应用程序可以根据需要解析引用。
手动链接的唯一限制是这些引用不传达数据库和集合名称。如果单个集合中的文档与多个集合中的文档相关,则可能需要考虑使用数据库引用。

2 数据库引用(DBRef)

2.1 背景

数据库引用是表示一个文档的约定(convention),而不是特定的引用类型。除了_id字段的值外,它们还包括集合的名称,在某些情况下还包括数据库的名称。

2.2 格式

DBRef具有以下字段:

  • $ref
    $ref字段保存引用文档所在的集合的名称。
  • $id
    $id字段包含引用文档中_id字段的值。
  • $db
    可选的。
    包含引用文档所在的数据库的名称。
    仅某些驱动程序支持$db引用参数。

示例
DBRef文档类似于以下文档:

{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }

考虑来自在集合中的creator字段存储数据库引用的文档 :

{
  "_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
  // .. application fields
  "creator" : {
                  "$ref" : "creators",
                  "$id" : ObjectId("5126bc054aed4daf9e2ab772"),
                  "$db" : "users"
               }
}

此示例中的数据库引用指向: users数据库, creators 集合中, _id字段值为ObjectId(“5126bc054aed4daf9e2ab772”)的文档。

注意
数据库引用中字段的顺序很重要,使用DBRef时必须使用上述顺序。

2.3 支持数据库引用的驱动程序

驱动 数据库引用支持与否 备注
C 不支持 您可以手动遍历引用。
C++ 不支持 您可以手动遍历引用。
C# 支持 请参阅C#驱动程序页面以获取更多信息。
Haskell 不支持 您可以手动遍历引用。
Java 支持 请参阅Java驱动程序页面 以获取更多信息。
Node.js 支持 请参阅Node.js驱动程序页面 以获取更多信息。
Perl 支持 请参阅Perl驱动程序页面 以获取更多信息。
PHP 不支持 您可以手动遍历引用。
Python 支持 请参阅PyMongo驱动程序页面 以获取更多信息。
Ruby 支持 请参阅Ruby驱动程序页面 以获取更多信息。
Scala 不支持 您可以手动遍历引用。

2.4 使用

在大多数情况下,您应该使用手动引用方法来连接两个或更多相关文档。但是,如果需要引用多个集合中的文档,请考虑使用数据库引用。

进入MongoDB中文手册(4.2版本)目录


  1. 一些社区支持的驱动程序可能会有其他行为,并且可能会自动将数据库引用解析为文档。 ↩︎

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

数据库引用 的相关文章

  • Java MongoDB 获取子文档的值

    我试图从子文档中获取键的值 但我似乎无法弄清楚如何使用 BasicDBObject get 函数 因为键嵌入了两层深度 这是文档的结构 File name file 1 report name report 1 group RnD 基本上一
  • 修订:算法和数据结构

    我需要通过修订来构建和处理数据的想法 例如 我有一个对象数据库 例如汽车 每个对象都有许多属性 这些属性可以是任意的 因此没有一个固定的模式来描述这些对象 这些对象可能保存为键值对 现在我需要更改对象的属性 我不想完全重写它 我希望能够返回
  • 如何验证 ObjectID

    使用 Joi 模式验证 是否可以针对 MongoDB ObjectID 进行验证 像这样的事情可能很棒 id Joi ObjectId required error errorParser 我发现如果我这样做 Joi object id J
  • 使用 Spring Data MongoDB 查询纯 BSON

    是否可以在 Spring Data MongoDB 中查询纯 JSON BSON 数据 而无需将数据转换为实际的模型实现 我能找到的只是 MongoOperation 的
  • Mongodb - 为现有集合添加架构

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

    我似乎无法让我的 MapReduce 缩减功能正常工作 这是我的地图功能 function Map day Date UTC this TimeStamp getFullYear this TimeStamp getMonth this T
  • 使用 MongoDB 和 Nodejs 插入和查询日期

    我需要一些帮助在 mongodb 和 nodejs 中按日期查找记录 我将日期添加到抓取脚本中的 json 对象 如下所示 jsonObj last updated new Date 该对象被插入到 mongodb 中 我可以看到如下 la
  • 使用 C# 将 XML 转换为 BSON

    我想将 XML 文件转换为 BSON 然后将 BSON 导入 MongoDB 我进行了搜索 但找不到如何使用 C 来隐藏它 请向我提供使用 C 执行此操作的源代码 今天有同样的问题 这肯定不是最好的解决方案 但是 我在我的项目中以这种方式解
  • golang mongodb (mgo) 没有插入文档

    我在使用 mgo 在 mongodb 中保存 golang 结构时遇到问题 type AN Track Log struct Id bson ObjectId bson id omitempty user session id str st
  • NestJs/Mongoose 中的自动递增序列

    我正在将 NodeJs 项目迁移到 NestJs 该项目使用 MongoDB 作为后端数据库 使用 Mongoose 作为 ODM 我当时用的是猫鼬序列 https github com ramiel mongoose sequence插件
  • 在 MongoDB 查询中,负限制是什么意思?

    我正在使用 Mongoid ruby gem 与 MongoDB 进行交互 当我尝试从查询中获取某些内容时 它会添加 limit 1 即负数 当我希望它只使用1 我尝试在控制台中执行相同的操作 但它没有更改返回的文档 负数限制是否意味着什么
  • mongodb从不同数据库中选择

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

    我有以下问题 假设我有以下模型对象 class Person String id String firstName String lastName Map
  • UnhandledPromiseRejectionWarning: MongoError: w 必须是连接处的数字或字符串

    任何人都知道为什么我会收到此错误 UnhandledPromiseRejectionWarning MongoError w 必须是连接处的数字或字符串 我在运行下面的代码时遇到此错误 它的目的是检查用户是否在 mongodb 数据库中 如
  • 是否有像数据库的 JDBC 一样的 NoSQL/键值存储抽象库?

    我使用过很多 SQL 抽象库 例如 ODBC JDBC 和 ActiveRecord NoSQL 键值存储世界中有哪些抽象选项 我主要是问这个问题 这样如果我选择键值存储 那么我就可以使用抽象库而不会被锁定 考虑到周围键值存储的数量 我认为
  • 将MongoDb atlas数据库导出到本机Mongo compass

    我在 Atlas 中有一个名为 test 的远程数据库 我想将集合名称 image table 下载为 JSON 文件 在 Mac 终端中 mongoexport db test collection image table image j
  • MongoDB 按数组内部元素分组

    我有一个文章列表 每篇文章都有一个数组属性 其中列出了其中提到的各个个人 id oid 52b632a9e4f2ba13c82ccd23 providerName The Guardian url http feeds theguardia
  • MongoEngine 查询具有以列表中指定的前缀开头的属性的对象的列表

    我需要在 Mongo 数据库中查询具有以列表中任何前缀开头的特定属性的元素 现在我有一段这样的代码 query mymodel terms term in query terms 并且这会匹配在列表 term 上有一个项目的对象 该列表中的
  • 是否可以从 MongoDB 查询返回计算字段?

    在 SQL 中我可以做类似的事情 SELECT myNum myNum 1 as increment FROM myTable 有效地执行任意数学和其他函数 并将它们作为结果中的字段返回 MongoDB 也可以做同样的事情吗 db test
  • pymongo MongoClient 连接到 ReplicaSet

    我采用 pymongo 的 MongoClient 类来连接到具有三个节点 1 个主节点 2 个辅助节点 的副本集 代码片段如下 c MongoClient secondary1 hostname secondary2 hostname r

随机推荐

  • Windows下的Rime輸入法與小鶴雙拼的配置

    今天結束了這一週的考試 於是有一個晚上的空閒時間來寫博客了 考慮到已經沒有使用簡體字的太大必要了 所以我也準備在博客的書寫中使用繁體漢字 這就涉及到了很多輸入法 比如我正在使用的QQ輸入法 無法正確處理一簡對多繁 的一個大問題 大多數的輸入
  • java 使用hutool工具进行MD5加密

    引入依赖
  • 咏儿 gz.lrd

    人 生 惬 意 几 个 秋 闲 云 野 鹤 解 春 愁 醉 看 过 往 十 年 数 还 笑 今 朝 小 儿 休
  • 高仿美团主界面<一>

    声明 本demo还未完善 正在持续更新中 先上图吧 这个小demo资源图片全是用青花瓷抠出来的 现在只是完成了 一部分 会持续更行中 有兴趣的朋友可以关注我 我们一起coding 一起分享 然后这个demo很简单 但是有一些小细节可以和大家
  • MySQL性能优化配置/etc/my.cnf参数

    MySQL etc my cnf文件配置 client port 3306 socket var lib mysql mysql sock default character set utf8 mysql no auto rehash 仅允
  • Java多线程使用案例【附可运行代码】

    标题Java多线程使用案例 1 创建线程池 创建任务 将任务提交到线程池中执行 public class Test1 private static Map
  • Parcelable 和 Serializable的区别和使用

    序列化 为了保存在内存中的各种对象的状态 并可以把保存的对象的状态读出来 一 Seralizable介绍 1 Serializable 是java的序列化技术 最简单的使用方式为在需要序列化的class增加implements Serial
  • 快速部署Qsign签名服务器为go-cqhttp或icqq进行签名认证

    rhwong unidbg fetch qsign onekey 用于一键在Windows下部署fuqiuluo unidbg fetch qsign github com 本项目使用1 1 6版本 由于当前go cqhttp 1 1 0
  • cmake:指定install的安装目录

    使用 CMAKE INSTALL PREFIX 来指定 方法1 在执行cmake时指定 cmake DCMAKE INSTALL PREFIX lt 你想要安装的路径 gt 方法二 设置CMAKE INSTALL PREFIX 变量 SET
  • IDEA中plugins中搜索不到插件问题解决

    2018 3 5 IDEA中plugins中搜索不到插件问题解决 由于项目中需要一些简化开发的一些插件 但是在idea中搜索不到任何的插件 很是痛苦 下面提供两种解决办法 一 第一种解决办法 首先进入File gt setting界面 gt
  • 什么是ELK

    什么是ELK ELK 并不是一个技术框架的名称 它其实是一个三位一体的技术名词 ELK 的每个字母都来自一个技术组件 分别是 Elasticsearch 简称 ES Logstash 和 Kibana 三个技术组件是独立的 后两个被elas
  • pcl中ransac提取直线_pcl学习笔记1

    文 云师弟 源 云师弟 编 云师弟 文仅交流 如侵联删 点击上方 云师弟的学习空间 关注 星标 获取有趣 好玩的前沿干货 PCL The Point Cloud Library 是用于2D 3D图像和点云处理的大规模开放项目 开源软件 它是
  • 小程序数据证明采集_小程序数据埋点实践之曝光量

    什么是数据埋点 所谓数据埋点就是应用在规定流程中 对特定行为或事件进行数据采集 使用采集的数据做用户分析和页面分析 可以获得应用的总体使用情况 为后续优化产品和运营提供数据支撑 常见数据埋点内容包括 访问量 停留时长 曝光量 点击量 跳出率
  • docker 命令查看当前所有服务的物理性能命令

    docker stats no stream docker ps awk NR gt 1 print NF grep wmy CONTAINER sort n r k 8 docker stats 查看每个容器状态 no stream 当前
  • 简单几步,用Visual Studio写出并运行一个c程序

    1 首先请确保安装了相应的IDE 作者使用的VS版本为最新 已目前文章发布时间为准 的2022版本 而版本只要不是太远古本方法通用 2 创建一个新项目 打开VS 点击创建新项目 找到c 的空项目 点击使其创建 更换项目名称 点击右下角创建
  • 【Yarn】Yarn StateMechine有限状态机

    文章目录 1 概述 2 StateMachine 2 1 InternalStateMachine 2 1 1 maybeMakeStateMachineTable 2 2 StateMachineFactory 2 2 1 获取实例 2
  • Available Packages显示nothing to show

    项目场景 pycharm添加包 use conda package manager 问题描述 在使用pycharm添加包时availiable packages 显示nothing to show 且右上角一直刷新 原因分析 安装的时候an
  • python中int的功能_Python内置函数int()高级用法

    int 函数常用来把其他类型转换为整数 例如 gt gt gt int 3 2 3 gt gt gt int 1 3 0 其实 int是Python内置类型之一 之所以能够当作函数来用 是因为它提供了构造方法 另外 它还提供了第二个参数支持
  • upload-labs靶场通关指南(第1-3关)

    今天继续给大家介绍渗透测试相关知识 本文主要内容是upload labs靶场通关指南 第1 3关 免责声明 本文所介绍的内容仅做学习交流使用 严禁利用文中技术进行非法行为 否则造成一切严重后果自负 再次强调 严禁对未授权设备进行渗透测试 一
  • 数据库引用

    目录 1 手动引用 1 1 背景 1 2 程序 1 3 使用 2 数据库引用 DBRef 2 1 背景 2 2 格式 2 3 支持数据库引用的驱动程序 2 4 使用 进入MongoDB中文手册 4 2版本 目录 对于MongoDB中的许多用