2011-04-13 28 views

回答

10

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

您的GUID值末尾缺少两个十六进制数字,因此就本例而言,我将假设它们为“00”。下面的值是相同的:

hex: "E3E45566-AFE4-A564-7876-AEFF6745FF00" (ignoring dashes)

base64: "ZlXk4+SvZKV4dq7/Z0X/AA=="

所以您的查询应该是:

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

我假设如果没有,用什么驱动程序来创建数据的二进制亚型正确设置为3。 ?

+2

哦,亲爱的,那不是很人性化的就是它了!我将通过使用现有的guid作为密钥来保护MSSQL中的MongoDB,并且不时地运行现场查询。我想我只需要找出一种简单的方法来手动将hex guid转换为base64。谢谢你的帮助! – Journeyman 2011-04-13 17:39:07

+0

我知道......我试图找到一个Javascript函数,它可以将一个十六进制字符串转换为一个Base64字符串,但似乎并没有内置到该语言中。你可以搜索人们为此写的功能。或者你可以用C#代替Javascript编写你的导入程序? – 2011-04-13 17:54:57

+3

要将GUID转换为base64字符串:'Convert.ToBase64String(Guid.NewGuid()。ToByteArray())' – 2011-06-03 01:04:37

15

您可以轻松地使用:

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

CSUUID在mongo中不是“标准”。您需要从csharpdriver获取文件,并在启动shell时将其包含在内。关于这方面的更多信息:http://stackoverflow.com/a/8252047/111625 – 2012-06-27 14:58:10

4

您可以使用下面的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文件的功能并加载它或在进行查询之前将其打开,如果从结果中复制值,则应重新命名该函数:

  • L UUID的传统UUID
  • JUUID对Java编码
  • NUUID对.NET编码
  • CSUUID为C#编码
  • PYUUID为Python编码