我得到了一个结构如下的文档。我的问题是如何在数据库端进行嵌套部分的“角色”验证。我的要求是:
如果创建了角色,则存在角色的名称和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] 删除。
我来说两句