使用 MongoDB shell 时,如何使用 guid 数据类型(我已将其用作集合中的 _id)。
以下格式无效:
>db.person.find({"_id","E3E45566-AFE4-A564-7876-AEFF6745FF"});
谢谢。
您可以轻松使用:
.find({ "_id" : CSUUID("E3E45566-AFE4-A564-7876-AEFF6745FF")})
您必须将 _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。如果不是,则使用什么驱动程序来创建数据?
您可以在查询前面使用以下 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 文件中并在进行查询之前加载或打开它,如果您从结果中复制值,则应使用以下方式重命名该函数:
我知道这是一个老问题,但如果没有任何额外的需求,你可以使用这个:
find({_id:UUID('af64ab4f-1098-458a-a0a3-f0f6c93530b7')})
您可以使用 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();
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==")});