笔者发现使用NoSQLBooster for MongoDB工具以GUID为条件查询还不太方便,如果直接用字符串查是查不到结果的。
没有结果。
后来研究发现需要先转成BASE64字符串,然后用下面这种语法查询才能出结果
以此类推,尝试解决了如何在Nodejs查询,步骤如下:
1) 先把guid字符串转换成base64字符串:
笔者参考了StackOverflow的一个帖子,修改成typescript写法,如下
const hexlist = '0123456789abcdef';
const b64list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
//一般x86的机器都是little endian, 第二个参数bigEndian通常可以不填,除非你知道目标机器
//是采用BigEndian格式
export const guid_to_base64 = (g:string, bigEndian?:boolean) : string => {
let s = g.replace(/[^0-9a-f]/ig, '').toLowerCase();
if (s.length != 32) return '';
if (!bigEndian) s = s.slice(6, 8) + s.slice(4, 6) + s.slice(2, 4) + s.slice(0, 2) +
s.slice(10, 12) + s.slice(8, 10) +
s.slice(14, 16) + s.slice(12, 14) +
s.slice(16);
s += '0';
let a, p, q;
let r = '';
let i = 0;
while (i < 33) {
a = (hexlist.indexOf(s.charAt(i++)) << 8) |
(hexlist.indexOf(s.charAt(i++)) << 4) |
(hexlist.indexOf(s.charAt(i++)));
p = a >> 6;
q = a & 63;
r += b64list.charAt(p) + b64list.charAt(q);
}
r += '==';
return r;
} // guid_to_base64()
2) 在mongodb client 代码里把base64字符串转成binary查询,以下是示例代码:
注: mongodb包版本为 4.1.3
import { MongoClient, Binary } from 'mongodb'
const password = encodeURIComponent('mongo#2021'); //含有特殊字符需要转义
const mongo_url = `mongodb://root:${password}@192.168.1.168:27017`
import { guid_to_base64 } from './util/guid'; //上面写的那段代码文件
export interface AlgTask {
TaskId:string
Status:number
CreatedTime:Date
UpdatedTime:Date
}
const taskHandler = async (guid:string) => {
const client = new MongoClient(mongo_url);
try{
await client.connect();
const database = client.db("test");
const tasks = database.collection<AlgTask>("AlgTasks");
const guid64 = guid_to_base64(guid);
const binId = new Binary(Buffer.from(guid64, 'base64'), 3);
const task = await tasks.findOne<AlgTask>(
{ TaskId: binId }
);
}
finally {
await client.close();
}
};
await taskHandler("7384ff39-a8bd-66a3-c4d7-4d3a80e245bf");
通过这种方式就可以将数据查询出来。
参考: