nodejs查询mongodb如何使用guid字符串查询

笔者发现使用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");

通过这种方式就可以将数据查询出来。

参考:

javascript - Mongo and Node.js: Finding a document by _id using a UUID (GUID) - Stack Overflowhttps://stackoverflow.com/questions/27018257/mongo-and-node-js-finding-a-document-by-id-using-a-uuid-guid

https://stackoverflow.com/questions/6095115/javascript-convert-guid-in-string-format-into-base64https://stackoverflow.com/questions/6095115/javascript-convert-guid-in-string-format-into-base64

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值