如何在 mongodb shell 查询中使用 guid

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

使用 MongoDB shell 时,如何使用 guid 数据类型(我已将其用作集合中的 _id)。

以下格式无效:

>db.person.find({"_id","E3E45566-AFE4-A564-7876-AEFF6745FF"});

谢谢。

shell mongodb guid
6个回答
37
投票

您可以轻松使用:

.find({ "_id" : CSUUID("E3E45566-AFE4-A564-7876-AEFF6745FF")})

20
投票

您必须将 _id 值与 BinData 实例进行比较(而不是与字符串进行比较)。不幸的是,BinData 构造函数采用 Base64 字符串而不是十六进制字符串。

您的 GUID 值末尾缺少两个十六进制数字,因此出于本示例的目的,我将假设它们为“00”。以下值是等效的:

十六进制:“E3E45566-AFE4-A564-7876-AEFF6745FF00”(忽略破折号)

base64:“ZlXk4+SvZKV4dq7/Z0X/AA==”

所以你的查询应该是:

>db.person.find({_id : new BinData(3, "ZlXk4+SvZKV4dq7/Z0X/AA==")})

我假设二进制子类型已正确设置为 3。如果不是,则使用什么驱动程序来创建数据?


19
投票

您可以在查询前面使用以下 js 函数,如下所示:

function LUUID(uuid) {
    var hex = uuid.replace(/[{}-]/g, ""); // removes extra characters
    return new UUID(hex); //creates new UUID
}

db.person.find({"_id" : LUUID("E3E45566-AFE4-A564-7876-AEFF6745FF"});

您可以将函数保存在 .js 文件中并在进行查询之前加载或打开它,如果您从结果中复制值,则应使用以下方式重命名该函数:

  • 旧版 UUID 的 LUUID
  • Java 编码的 JUUID
  • .net 编码的 NUUID
  • C# 编码的 CSUUID
  • Python编码的PYUUID

1
投票

我知道这是一个老问题,但如果没有任何额外的需求,你可以使用这个:

find({_id:UUID('af64ab4f-1098-458a-a0a3-f0f6c93530b7')})

0
投票

您可以使用 split() 和 join() 解决方法来解决此问题:

例如,如果我在-函数内使用

“E3E45566-AFE4-A564-7876-AEFF6745FF”
十六进制值与
UUID()
,它不会在mongo中返回
BinData
,所以请尝试在之前删除所有
-
传递给
UUID
函数。

db.person.find({"_id":UUID("E3E45566-AFE4-A564-7876-AEFF6745FF".split("-").join(''))});

或者通过定义一个变量来在多行中执行此操作:

var uuid = UUID("E3E45566-AFE4-A564-7876-AEFF6745FF".split("-").join(''))
db.person.find({"_id":uuid});

或者通过创建一个简单的函数:

function BUUID(uuid){
    var str = uuid.split("-").join('');
    return new UUID(str);
}
db.person.find({"_id": BUUID("E3E45566-AFE4-A564-7876-AEFF6745FF")}).pretty();

0
投票

Mongo BinData 格式在存储数据之前翻转前半个字节和后半个字节。

此 python 代码可以将 UUID 转换为 BinData() 旧格式 03:

import base64
import uuid

def mongo_bin_data_to_uuid(bin_data_base64):
    raw_bytes = base64.b64decode(bin_data_base64)
    flipped_bytes = raw_bytes[7::-1] + raw_bytes[-1:7:-1]
    return str(uuid.UUID(bytes=flipped_bytes))

def uuid_to_mongo_bin_data(uuid_string):
    flipped_bytes = uuid.UUID(uuid_string).bytes
    raw_bytes = flipped_bytes[7::-1] + flipped_bytes[-1:7:-1]
    return base64.b64encode(raw_bytes).decode()

uuid_to_mongo_bin_data("E3E45566-AFE4-A564-7876-AEFF6745FF00")
的结果是
ZKXkr2ZV5OMA/0Vn/652eA==

查询如下所示:

>db.person.find({"_id", BinData(03, "ZKXkr2ZV5OMA/0Vn/652eA==")});
© www.soinside.com 2019 - 2024. All rights reserved.