不太喜欢Golang的零值,它会自动生成零值ObjectId,如下所示:
我目前正在使用 JSON Schema,如下所示:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://vibe.com/wss/src/common/mongo/mongo-message-ack",
"$ref": "#/$defs/MongoMessageAck",
"$defs": {
"MongoMessageAck": {
"properties": {
"_id": {
"$ref": "#/$defs/ObjectID"
},
"MessageId": {
"$ref": "#/$defs/ObjectID"
}
},
"additionalProperties": false,
"type": "object",
"required": [
"_id",
"MessageId",
]
},
"ObjectID": {
"items": {
"type": "integer"
},
"type": "array",
"maxItems": 12,
"minItems": 12
}
}
}
这部分对 ObjectId 进行一些验证:
"ObjectID": {
"items": {
"type": "integer"
},
"type": "array",
"maxItems": 12,
"minItems": 12
}
我也在网上看到了这个:
"$expr": {
"$and": [
{ "$ne": ["$_id", ObjectId("000000000000000000000000")] },
{ "$ne": ["$MessageId", ObjectId("000000000000000000000000")] }
]
}
但是
$expr
不是有效的 JSON,这不太方便(尽管可行)。
有没有好的方法来防止 0-id 出现在 Mongo 中?
一个解决方案是为每个对象 ID 创建一个唯一索引,然后为所有这些字段预先插入零 ID,但我想在其之上找到另一层以确保这一点,以防我忘记创建索引对于随机对象 id 字段...
首先,
ObjectID
不应该是一个数组。
除此之外,
min/maxItems
的使用是对数组[1,2,3]
中的项数的约束,而不是数组值的长度[123]
您是否试图将数组限制为 12 个项目或将值的长度限制为 12 位?这是两个不同的约束。 JSON Schema 并不完全支持后者,但如果您不介意处理解析错误,您可以使用一种 hacky 解决方案来完成它,因为 JSON 不允许前导零。
点击这个答案,用 JSON 解释
DecimalIntegerLiteral
:https://stackoverflow.com/a/27361732/8564731
这要求数字至少为 100_000_000_000 且不大于 999_999_999_999
{
"ObjectID": {
"items": {
"type": "integer",
"exclusiveMinimum": 99999999999,
"exclusiveMaximum": 1000000000000
},
"type": "array",
"minItems": 1
}
}
另一个考虑因素是您是否按预期使用 MongoDB ObjectID。您插入整数是因为您尝试创建唯一值,还是尝试使用修改后的时间戳(如其文档中所述)? https://www.mongodb.com/docs/manual/reference/method/ObjectId/#specify-an-integer-string
如果你想使用字符串,你可以用下面的方法完成长度约束,假设我之前的评论不需要数组
{
"ObjectID": {
"type": "string",
"pattern": "[a-z0-9]+",
"minLength": 12,
"maxLength": 12
}
}