一般如何避免为 MongoDB 对象插入零 ID(使用 golang)等

问题描述 投票:0回答:1

不太喜欢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 字段...

mongodb go jsonschema bson objectid
1个回答
0
投票

首先,

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.