sql >> Databáze >  >> NoSQL >> MongoDB

Získejte BinData UUID z Mongo jako řetězec

Odpověď na vaši otázku je složitější, než byste čekali! Hlavním důvodem, proč je to komplikované, je to, že z historických důvodů (bohužel) různé ovladače zapisovaly UUID do databáze pomocí různých pořadí bajtů. Neuvádíte, který ovladač používáte, ale jako příklad použiji ovladač C#.

Předpokládejme, že pro vložení dokumentu používám následující kód:

var guid = new Guid("00112233-4455-6677-8899-aabbccddeeff");
collection.Insert(new BsonDocument {
    { "_id", guid },
    { "x", 1 }
});

Pokud poté dokument prozkoumám pomocí prostředí Mongo, bude vypadat takto:

> db.test.findOne()
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>

Shell Mongo má vestavěnou funkci zvanou hex, kterou můžete použít k zobrazení binární hodnoty jako hexadecimálního řetězce:

> var doc = db.test.findOne()
> doc._id.hex()
33221100554477668899aabbccddeeff
>

Podívejte se pozorně:pořadí bajtů hexadecimálního řetězce neodpovídá původní hodnotě UUID použité v programu C#. Je to proto, že ovladač C# používá pořadí bajtů vrácené metodou ToByteArray společnosti Microsoft třídy Guid (která bohužel vrací bajty v bizarním pořadí, což nebylo mnoho měsíců objeveno). Ostatní ovladače mají své vlastní zvláštnosti.

Abychom s tím pomohli, máme některé pomocné funkce napsané v Javascriptu, které lze načíst do prostředí Mongo. Jsou definovány v tomto souboru:

https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js

Mongo shellu lze říci, aby zpracoval soubor při jeho spouštění, zadáním názvu souboru na příkazovém řádku (spolu s argumentem --shell). Po načtení tohoto souboru máme přístup k řadě pomocných funkcí pro vytvoření a zobrazení hodnot BinData, které jsou UUID. Například:

C:\mongodb\mongodb-win32-x86_64-2.0.1\bin>mongo --shell uuidhelpers.js
MongoDB shell version: 2.0.1
connecting to: test
type "help" for help
> var doc = db.test.findOne()
> doc._id.toCSUUID()
CSUUID("00112233-4455-6677-8899-aabbccddeeff")
> db.test.find({_id : CSUUID("00112233-4455-6677-8899-aabbccddeeff")})
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
>

V tomto příkladu se funkce toCSUUID používá k zobrazení hodnoty BinData jako CSUUID a funkce CSUUID se používá k vytvoření hodnoty BinData pro UUID pomocí konvencí řazení bajtů ovladače C#, abychom mohli dotazovat na UUID. Pro ostatní ovladače existují podobné funkce (toJUUID, toPYUUID, JUUID, PYUUID).

Jednoho dne v budoucnu se všechny ovladače standardizují na nový binární podtyp 4 se standardním pořadím bajtů. Mezitím musíte použít vhodnou pomocnou funkci, která odpovídá jakémukoli ovladači, který používáte.



  1. Redis je jednovláknové. Tak proč bych měl používat salát?

  2. Odstraňte duplikát v MongoDB

  3. Návrh datové struktury Redis pro třídění hodnot na základě času

  4. MongoDB C#:Nejlepší vzor serializace ID