2011-04-13 53 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編碼