mongodb objectid java_我可以确定字符串是否是MongoDB ObjectID吗?

article/2025/10/3 9:45:42

回答(10)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我发现mongoose ObjectId验证器用于验证有效的objectIds,但我发现了一些无效ID被认为有效的情况 . (例如:任何12个字符长的字符串)

var ObjectId = require('mongoose').Types.ObjectId;

ObjectId.isValid('microsoft123'); //true

ObjectId.isValid('timtomtamted'); //true

ObjectId.isValid('551137c2f9e1fac808a5f572'); //true

为我工作的是将一个字符串转换为objectId,然后检查原始字符串是否与objectId的字符串值匹配 .

new ObjectId('timtamtomted'); //616273656e6365576f726b73

new ObjectId('537eed02ed345b2e039652d2') //537eed02ed345b2e039652d2

这项工作是因为有效ID在转换为ObjectId时不会更改,但获取false有效的字符串在转换为objectId时会更改 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

您可以使用正则表达式来测试:

CoffeeScript的

if id.match /^[0-9a-fA-F]{24}$/

# it's an ObjectID

else

# nope

JavaScript的

if (id.match(/^[0-9a-fA-F]{24}$/)) {

// it's an ObjectID

} else {

// nope

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我过去曾使用本机节点mongodb驱动程序执行此操作 . isValid方法检查该值是否为有效的BSON ObjectId . See the documentation here.

var ObjectID = require('mongodb').ObjectID;

console.log( ObjectID.isValid(12345) );

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这是我根据@ andy-macleod的答案编写的一些代码 .

它可以采用int或string或ObjectId,如果传递的值有效则返回有效的ObjectId,如果无效,则返回null:

var ObjectId= require('mongoose').Types.ObjectId;

function toObjectId(id) {

var stringId = id.toString().toLowerCase();

if (!ObjectId.isValid(stringId)) {

return null;

}

var result = new ObjectId(stringId);

if (result.toString() != stringId) {

return null;

}

return result;

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果你有十六进制字符串,你可以使用这个:

ObjectId.isValid(ObjectId.createFromHexString(hexId));

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我花了一段时间才得到一个有效的解决方案,因为@Andy Macleod提出的将objectId值与其自己的字符串进行比较的方法正在崩溃Express.js服务器:

var view_task_id_temp=new mongodb.ObjectID("invalid_id_string"); //this crashed

我只是用一个简单的try catch来解决这个问题 .

var mongodb = require('mongodb');

var id_error=false;

try{

var x=new mongodb.ObjectID("57d9a8b310b45a383a74df93");

console.log("x="+JSON.stringify(x));

}catch(err){

console.log("error="+err);

id_error=true;

}

if(id_error==false){

// Do stuff here

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

对于mongoose,使用isValid()函数检查objectId是否有效

示例:

var ObjectId = mongoose.Types.ObjectId;

if(ObjectId.isValid(req.params.documentId)){

console.log('Object id is valid');

}else{

console.log('Invalid Object id');

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我找到的唯一方法是使用我想要检查的值创建一个新的ObjectId,如果输入等于输出,则id是有效的:

function validate(id) {

var valid = false;

try

{

if(id == new mongoose.Types.ObjectId(""+id))

valid = true;

}

catch(e)

{

valid = false;

}

return valid;

}

> validate(null)

false

> validate(20)

false

> validate("abcdef")

false

> validate("5ad72b594c897c7c38b2bf71")

true

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果字符串包含12个字母,则mongoose.Types.ObjectId.isValid(string)始终返回True

let firstUserID = '5b360fdea392d731829ded18';

let secondUserID = 'aaaaaaaaaaaa';

console.log(mongoose.Types.ObjectId.isValid(firstUserID)); // true

console.log(mongoose.Types.ObjectId.isValid(secondUserID)); // true

let checkForValidMongoDbID = new RegExp("^[0-9a-fA-F]{24}$");

console.log(checkForValidMongoDbID.test(firstUserID)); // true

console.log(checkForValidMongoDbID.test(secondUserID)); // false

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

警告:对于以有效十六进制数字开头的任意12/24长度字符串, isValid 将返回 true . 目前我认为这是一个更好的检查:

((thing.length === 24 || thing.length === 12)&& isNaN(parseInt(thing,16))!== true)


http://chatgpt.dhexx.cn/article/KwUTGBhE.shtml

相关文章

MongoDB 认识ObjectId

官方文档:https://docs.mongodb.com/manual/reference/method/ObjectId/ 现在我们有一个集合如下 db.class0.insertMany([{"name": "一年级一班","headmaster": "王老师"},{"name": "一年级二班",&q…

mysql objectid_【Mongodb】_id和ObjectId详解!

2.6.6 _id和ObjectId MongoDB 中存储的文档必须有一个"_id" 键。这个键的值可以是任何类型的,默认是个ObjectId 对象。在一个集合里面,每个文档都有唯一的"_id" 值,来确保集合里面每个文档都能被唯一标识。如果有两个集合…

Mongodb ObjectId格式

ObjectId是一个24位的字符串,实际是由一组十六进制的字符构成,共12个字节。(1个字节8位能表示2个十六进制数,12个字节能表示24个十六进制数)。 ObjectId 是一个12字节 BSON 类型数据,有以下格式&#xff1a…

java objectid_关于MongoDB ObjectId

ObjectId的构成 ObjectId的值由12个字节组成,其中, 4个字节表示时间戳(自Unix纪元以来的秒数),记录创建时间; 3个字节表示机器标识符,保证不同主机产生不同的ObjectId值; 2个字节表示进程ID,保证…

从根上理解MongoDB的ObjectId生成原理!

想写这篇文章好久了,一直抽不出时间。这两天端午节放假,我和娃都泡在图书馆,在他看书的空闲期,我拿出电脑写下了本文。 我们都知道,在分布式系统中,分布式 ID 有很多特殊的要求,其中之二就是要求…

ArcGIS中的OBJECTID、FID 和 OID 的区别!不要傻傻分不清

喜欢就关注我们吧 时常有很多我朋友分不清OBJECTID、FID 和 OID有什么区别,不懂得怎么应用和管理,今天我们来说个明白。 ArcGIS Desktop 产品要求独立表和属性表均具有 ObjectID字段,该字段包含唯一的长整型用于标识每个记录。 此 ID 由 Esri…

Mongo中id介绍

好记忆不如按烂笔头 ,即便是最简单的,时间长了也难免会忘记,记下可以让你更明白。 2.6.6 _id和ObjectId MongoDB 中存储的文档必须有一个"_id" 键。这个键的值可以是任何类型的,默认是个ObjectId 对象。在一个集合里面…

canal

简介 canal [kənl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增…

阿里的数据同步神器——Canal

前言 同步数据的神器: Canal安装配置 canal [kə’nl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署, 存在跨机房同步的业务需求, 实现方式主要是基于业务 trigger 获取增量变更。从 2…

使用Canal组件订阅MySQL binlog数据增量

一、简介 Canal是一款强大的开源组件,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 1. canal 工作原理 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议MySQ…

mysql进阶:canal搭建主从|集群架构

0.引言 之前我们讲解过canal的各种应用,但是对于生产环境来讲,服务高可用是必须保证的。因此canal单节点是不能满足我们的需求的。就需要搭建canal集群。 1. canal集群模式 从架构方式上出发,我们用来保证服务高可用的手段主要是主从架构、…

ElasticSearch 7.15.2 使用java canal 接入实现灵活化增量数据准实时同步

前言: ①canal.adapter-1.1.5 支持一对一单表的增量数据同步ElasticSearch 7; ②对于多表聚合场景的SQL满足不了我们的业务需求。 ③采用java canal 接入,可以实现灵活化增量数据准实时同步 文章目录 一、java canal 接入1. 依赖导入2. 增加配…

浅入浅出keepalived+mysql实现高可用双机热备

当数据库发生宕机的情况,如果配置了数据库主从同步模式或主主同步模式,则可以从从库中获取数据。 当数据库发生宕机的情况,要求应用系统实现高可用,应用系统不会受到影响,需要对mysql进行双机热备实现数据库的高可用。 实现双机热备的方式有Mycat组件方式、canel组件方式、…

【硬刚大数据】大数据同步工具之FlinkCDC/Canal/Debezium对比

欢迎关注博客主页:微信搜:import_bigdata,大数据领域硬核原创作者_王知无(import_bigdata)_CSDN博客 欢迎点赞、收藏、留言 ,欢迎留言交流!本文由【王知无】原创,首发于 CSDN博客!本文首发CSDN论…

4、Canal的 instance模块

一、总体结构 如确所述,Canal server的模式有两种:manager和spring 在core模块中,定义了CanalInstance接口,以及其抽象类子类AbstractCanalInstance。 在spring模块,提供了基于spring配置方式的CanalInstanceWithSpr…

canal实现mysql数据同步

前言 canal是实现mysql数据备份,异地灾备,异地数据同步等重要的中间件,在实际的业务场景中有着广泛的使用,本文基于小编所在项目中一个异地数据同步的场景为例,通过案例演示下利用canal实现mysql数据同步的过程 同步原理 如上图所示,为canal同步mysql数据的原理的简单示…

SpringBoot系列之canal和kafka实现异步实时更新

SpringBoot系列之canal和kafka实现异步实时更新 实验开发环境 JDK 1.8SpringBoot2.2.1Maven 3.2+开发工具 IntelliJ IDEAsmartGit1、什么是阿里canal? canal是阿里开源的, 对数据库增量日志解析,提供增量数据订阅和消费的组件。引用官网的图片,canal的工作原理主要是模拟…

Java:SpringBoot整合Canal+RabbitMQ组合实现MySQL数据监听

canal [kə’nl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 目录 一、MySQL设置二、启动Canal服务端三、通过Canal客户端消费数据四、通过RabbitMQ消费数据1、启动RabbitMQ2、修改canal配置3、消…

Kubernetes 学习19基于canel的网络策略

一、概述 1、我们说过,k8s的可用插件有很多,除了flannel之外,还有一个流行的叫做calico的组件,不过calico在很多项目中都会有这个名字被应用,所以他们把自己称为project calico,但是很多时候我们在kubernet…

基于canel的网络策略

基于canel的网络策略 canel工作的默认网段是192.168.0.0/16的网段 官网:https://docs.projectcalico.org/v3.2/introduction/ 参考地址: https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/flannel 分别运行:…