MongoDB嵌套的子文档的文档验证

ing

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

  • 角色大小可以为0或大于1。
  • 如果创建了角色,则存在角色的名称和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"
      }
   }
} )

谁能告诉我如何进行嵌套文档验证?

布雷克七

编辑:这个答案是不正确的,它能够验证阵列中的所有子文件。查看答案:https//stackoverflow.com/a/43102783/200224

你真的不能。您可以执行以下操作:

"roles.name": { "$type": "string" }

但是真正的意思是,这些属性中的“至少一个”需要与指定的类型匹配。这意味着这实际上是有效的:

{
    "_id" : "123456",
    "name" : "User Name",
    "roles" : [
            {
                    "name" : "mobiles_user",
                    "last_usage_at" : ISODate("2016-03-03T10:23:12.991Z"),
                    "created_by" : "987654",
                    "created_at" : ISODate("2016-03-03T10:23:12.991Z")
            },
            {
                    "name" : "webs_user",
                    "last_usage_at" : ISODate("2016-03-03T10:23:12.991Z"),
                    "created_by" : "987654",
                    "created_at" : ISODate("2016-03-03T10:23:12.991Z")
            },
            {
                    "name" : 1
            }
    ]
}

这毕竟是“文档验证”,从本质上说,它不太适合数组中的子文档,或者实际上不适合包含在数组中的任何数据。

实现的核心依赖于查询运算符可用的表达式,并且由于MongoDB在标准查询表达式中缺少任何东西,而这些表达式都等于“所有数组条目必须匹配该值”而没有直接指定,因此无法表示为验证器条件。

检查数组内容(如在“查询”表达式中那样)的唯一可能性是使用$where,并且该注释在文档验证中不是可用的选项。

甚至$size可用于查询运算符也必须匹配特定的“大小”值,并且不能使用相等条件。因此,您可以“验证”严格的尺寸,但不能验证最小尺寸,除非:

"roles.0": { "$exists": true }

这是“婴儿期”的功能,有些实验,因此将来的发行版可能会解决此问题。

但是现在,您更好的选择是在客户端代码中进行这种“模式验证”(在该代码中,您将获得更好的异常报告)。已经有许多采用这种方法的库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

mongodb-嵌套文档的子聚合

来自分类Dev

MongoDB查询嵌套文档

来自分类Dev

MongoDB查询嵌套文档

来自分类Dev

MongoDB删除子文档

来自分类Dev

MongoDB查询-子文档

来自分类Dev

MongoDB保存子文档

来自分类Dev

Rethinkdb:包含嵌套文档的子文档

来自分类Dev

删除嵌套在MongoDB中的数组中的子文档

来自分类Dev

在不包含数组的Mongodb中排除嵌套的子文档

来自分类Dev

MongoDB查询可从嵌套数组中过滤子文档

来自分类Dev

删除嵌套在MongoDB中的数组中的子文档

来自分类Dev

查询Mongodb的子-子文档

来自分类Dev

Mongodb:从文档中拉出子文档

来自分类Dev

MongoDB提取子文档作为实际文档

来自分类Dev

根据子文档值搜索mongodb文档

来自分类Dev

MongoDB用文档替换子文档ID

来自分类Dev

Mongodb:从文档中拉出子文档

来自分类Dev

嵌套文档上的MongoDB $ lookup

来自分类Dev

MongoDB查询嵌套文档列表

来自分类Dev

Mongodb Aggregate嵌套子文档

来自分类Dev

PHP MongoDB嵌套文档搜索

来自分类Dev

Spring和MongoDB嵌套文档

来自分类Dev

Mongodb $ pull在嵌套文档上

来自分类Dev

mongodb中的嵌套文档聚合

来自分类Dev

仅基于子文档_id返回子文档,子文档_id是mongodb文档的array字段的项

来自分类Dev

用mongoDB插入子文档

来自分类Dev

MongoDB子文档查询数组

来自分类Dev

MongoDB中的子文档索引

来自分类Dev

MongoDB:查询子文档:Java