MongoDB 子文档嵌套文档验证

2023-11-25

我得到了一份结构如下的文档。我的问题是如何在数据库端进行嵌套部分“角色”验证。我的要求是:

  • 角色大小可以为 0 或大于 1。
  • 如果创建了角色,则存在角色的 name 和created_by。

    {
      "_id": "123456",
      "name": "User Name",
      "roles": [
        {
          "name": "mobiles_user",
           "last_usage_at": {
             "$date": 1457000592991
            },
            "created_by": "987654",
            "created_at": {
              "$date": 1457000592991
            }
        },
        {
          "name": "webs_user",
           "last_usage_at": {
             "$date": 1457000592991
            },
            "created_by": "987654",
            "created_at": {
              "$date": 1457000592991
            }
        },
      ]
    }
    

目前,我只对那些非嵌套属性执行以下操作:

db.createCollection( "users",
   { "validator" : {
     "_id" : {
         "$type" : "string"
      },
      "email" : {
         "$regex" : /@gmail\.com$/
      },
      "name" : {
         "$type" : "string"
      }
   }
} )

有人可以建议如何进行嵌套文档验证吗?


是的,就是你can通过否定来验证文档中的所有子文档$elemMatch,并且你可以确保大小不为 1。但它肯定不漂亮!而且也不完全明显。

> db.createCollection('users', {
...   validator: {
...     name: {$type: 'string'},
...     roles: {$exists: 'true'},
...     $nor: [
...       {roles: {$size: 1}},
...       {roles: {$elemMatch: {
...         $or: [
...           {name: {$not: {$type: 'string'}}},
...           {created_by: {$not: {$type: 'string'}}},
...         ]
...       }}}
...     ],
...   }  
... })
{ "ok" : 1 }

这很令人困惑,但它确实有效!它的意思是只接受大小都不符合的文档roles是 1 也不是roles有一个元素带有name那不是一个string or a created_by那不是一个string.

这是基于这样一个事实:用逻辑术语来说,

对于所有 x:f(x) 和 g(x)

相当于

不存在 x s.t.:不存在 f(x) 或不存在 g(x)

我们必须使用后者,因为 MongoDB 只给我们一个存在操作符。

Proof

有效文件工作:

> db.users.insert({
...   name: 'hello',
...   roles: [],
... })
WriteResult({ "nInserted" : 1 })

> db.users.insert({
...   name: 'hello',
...   roles: [
...     {name: 'foo', created_by: '2222'},
...     {name: 'bar', created_by: '3333'},
...   ]
... })
WriteResult({ "nInserted" : 1 })

如果缺少某个字段roles, 它失败:

> db.users.insert({
...   name: 'hello',
...   roles: [
...     {name: 'foo', created_by: '2222'},
...     {created_by: '3333'},
...   ]
... })
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})

如果一个字段在roles类型错误,失败:

> db.users.insert({
...   name: 'hello',
...   roles: [
...     {name: 'foo', created_by: '2222'},
...     {name: 'bar', created_by: 3333},
...   ]
... })
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})

If roles大小为 1 时失败:

> db.users.insert({
...   name: 'hello',
...   roles: [
...     {name: 'foo', created_by: '2222'},
...   ]
... })
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})

不幸的是,我唯一不明白的是如何确保角色是一个数组。roles: {$type: 'array'}我认为似乎一切都失败了,因为它实际上是在检查元素的类型'array'?

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

MongoDB 子文档嵌套文档验证 的相关文章

随机推荐

  • 更改 Velocity.Log 文件的位置

    看起来很简单 文档位于http velocity apache org engine devel developer guide html Configuring Logging说要设置runtime log属性 这是我所有财产的所得 ve
  • 获取android中用户的语言

    http web archiveorange com archive v fwvde0wN3xcViMtADw6x 似乎 navigator language 属性在 android 上的 webview 中始终为 en 那么 获取用户语言
  • 确定硬币组合的算法

    最近 我遇到了一个关于编程算法的提示 但我不知道该怎么做 我以前从未真正编写过算法 所以我在这方面还是个新手 该问题要求编写一个程序来确定收银员根据硬币价值和硬币数量找零的所有可能的硬币组合 例如 一种货币可能有 4 个硬币 2 分 6 分
  • 有没有办法获取当前函数的函数名?

    defun foo send to debug log Error Function terminated get current function name 我目前这样做 defun foo send to debug log Error
  • 当购物车达到一定数量时添加促销产品

    我正在 WooCommerce 中寻找正确的钩子 因为当达到一定的购物车数量 例如 100 个常规单位 时 我需要将促销产品添加到购物车 我也用过钩子 init 但我认为这是不对的 这是我的代码 function add free prod
  • OpenCV for Android:无法加载级联分类器错误

    这是我第一次使用 openCV 库 我想用它来检测眼睛 我已经用过FdActivity本教程中提供的代码 http romanhosek cz android eye detection updated for opencv 2 4 6 本
  • 使用 Perl 匹配两个重叠模式

    我希望我的问题还没有被其他人提出 因为我试图查看网站上的几乎所有地方 但我无法找到答案 我的问题是 我正在制作一个 PERL 脚本 它必须检测每一次出现 of one or字符串中的另一个模式 例如 string betaalphabeta
  • 从 C# 类生成 UML 图

    我有 nHibernate 生成的类 用作持久保存到 SQL 数据库的 MVC 项目的 BO 我想将现有代码呈现为 UML 图表 以便我可以开始使用代码生成实用程序 与所问的类似here仅适用于 SQL nhibernate SO 建议从
  • 如何在 javascript 中对 url 进行编码并在 C# 中对其进行解码

    我有一个带有查询字符串的网址 通过它传递一些数据 我想在服务器端检索数据 这个问题的解决办法是什么 您可以使用 javascript 的转义函数对 URL 进行编码 Example escape It s me result It 27s
  • 我应该如何理解&**self in Box

    boxed rs 中的代码 stable feature rust1 since 1 0 0 rustc const unstable feature const box issue 92521 impl
  • 全新的rails应用程序,无法生成脚手架

    虽然我不是专家 但我已经在内部开发了一些 Rails 应用程序 用于一些相对小型 中型的项目 并且之前没有遇到过与此类似的问题 我只是想创建一个新的应用程序 然后创建一个脚手架 但我收到了有关 sqlite3 gem 的错误 看看这个 我的
  • ExpandableListView 显示没有子项的组的指示器

    我正在创建一个ExpandableListView与数据库中的数据 为此 我正在使用CursorTreeAdapter我用一个填充它Cursor包含我从数据库检索的数据的对象 我认为 默认情况下Android会考虑没有孩子的组 不可扩展 但
  • 为什么从 v6 升级到 IdentityModel v7 后出现 IDX20803 错误?

    升级后Microsoft IdentityModel Tokens and System IdentityModel Tokens Jwt to 7 0 0 我收到此错误 IDX20803 无法从 https example com rea
  • 修改本地存储?

    我正在使用 simplecartjs 为在线商店提供支持 它将数据存储在本地存储中 如下所示 SCI 1 quantity 1 id SCI 1 price 20 name Mattamusta teippi size Tyhj SCI 3
  • Android:如何将预览帧保存为jpeg图像?

    我想将预览帧保存为 jpeg 图像 我尝试编写以下代码 public void onPreviewFrame byte data Camera camera if settings isRecording Camera Parameters
  • 使用 TypeScript 和 React 输入 redux 表单 v7

    我有一个简单的由react redux驱动的表单 我希望有一个 form container tsx 和一个 form component tsx 其中 form container tsx 保存所有到 redux 状态的连接减去 Fiel
  • Xcode 界面生成器未检测到 Admob 框架类

    我一直在尝试在我的 iOS 应用程序中实现原生 Google adMob 广告 并遵循 admob 官方教程 https developers google com admob ios native advanced 无论我是手动添加所需的
  • c# 中的 blackmagic SDK

    我正在尝试在 windows7 64x 上使用最新的 SDK 2011 年 6 月 和 C VS 2010 Express 从一张 blackmagic 强度专业卡捕获 720p 我已经成功编译并运行了一个以 YUV 捕获帧的程序 但是 捕
  • 使用 Moq 模拟 nHibernate QueryOver

    测试时 以下行因空引用而失败 var awards session QueryOver Where x gt x BusinessId int business List 我的测试是这样的 var mockQueryOver new Moc
  • MongoDB 子文档嵌套文档验证

    我得到了一份结构如下的文档 我的问题是如何在数据库端进行嵌套部分 角色 验证 我的要求是 角色大小可以为 0 或大于 1 如果创建了角色 则存在角色的 name 和created by id 123456 name User Name ro