I have seen a few questions around this but none of them seem to directly solve the issue here.
So the scenario is there is a C# based API which writes data to a mongodb instance and uses a GUID as the _id
in mongo, so for example it would look like:
"_id" : new BinData(3, "+jscvebAl0+NO0n1WySLTQ=="),
So assume that it not going to change, it will always be that data type and there is nothing I can do about it.
So in nodejs I read in a document which contains some of these UUID which relate to other resources, however when I read in the documents using the nodejs 2.0 driver the UUID vars are read in as GUID strings, like so:
"someIdField": "c1489470-4e04-49ba-ae91-a20c009254e5"
So if I were to directly use { "_id" : someIdField }
it doesn't find the matching document, and I assume its because it needs to compare against the binary representation, not the string one, however I cannot seem to turn that string into something worthwhile.
I have tried using the npm uuid
package to parse and then use that buffer like so:
var bytes = Uuid.parse(uuid);
return new Binary(new Buffer(bytes), 3);
However that doesnt seem to work and I have tried other solutions including base64 encoding but nothing seems to bring back results. So is there anything else I need to be doing here?
Ok so I have got it working, and it was painful but after looking at the UUIDHelpers and some other code on stackoverflow it seems that this is the method I needed to get my stuff running:
module.exports = function(uuid) {
var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters
var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);
var b = hex.substr(10, 2) + hex.substr(8, 2);
var c = hex.substr(14, 2) + hex.substr(12, 2);
var d = hex.substr(16, 16);
hex = a + b + c + d;
var buffer= new Buffer(hex, "hex");
return new Binary(buffer, Binary.SUBTYPE_UUID_OLD);
};
That should turn a textual guid into a binary representation of a legacy guid.