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

S mongodb a průvodci pro ID dokumentů, jaký je efektivní způsob uložení průvodců, aby bylo možné snadno získat skutečného průvodce?

Práce s GUID má několik úskalí, většinou souvisejících s tím, jak pracovat s binární reprezentací v mongo shellu, a také s historickými nehodami, které vedly k tomu, že různé ovladače ukládaly GUID pomocí různého pořadí bajtů.

K ilustraci problémů jsem použil následující kód:

var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);

který když jsem spustil výstup:

Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be

když to zobrazím v mongo shellu, dostanu:

> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>

Všimněte si, že i když se zobrazí jako hexadecimální, pořadí bajtů neodpovídá původnímu GUID. To je ta historická nehoda, o které jsem mluvil. Jsou tam všechny bajty, jen jsou v neobvyklém pořadí díky implementaci Guid.ToByteArray(() od Microsoftu.

Abychom vám pomohli pracovat s GUID v mongo shellu, můžete zkopírovat následující soubor pomocných funkcí do adresáře, kde je uložen mongo.exe:

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

Soubor má v horní části několik stručných komentářů k dokumentaci, které by vám mohly pomoci. Chcete-li tyto funkce zpřístupnit v mongo shellu, musíte říct mongo shellu, aby četl tento soubor při spuštění. Podívejte se na následující ukázkovou relaci:

C:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongo --shell uuidhelpers.js
MongoDB shell version: 2.0.6
connecting to: test
type "help" for help
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
> doc._id.toCSUUID()
CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")
>

K dotazu na GUID můžete také použít další pomocnou funkci:

> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>

Pokud jde o ukládání vašich GUID jako řetězců, není to nic neobvyklého a rozhodně to usnadňuje prohlížení a dotazování na data v mongo shellu a zabraňuje všem problémům s různými pořadími bajtů. Jedinou nevýhodou je, že zabírá více místa (zhruba dvojnásobek).




  1. Je možné získat jeden souhrnný výsledek?

  2. Jak funguje zpětné volání Mongoose?

  3. Zobrazit pouze odpovídající pole pro textové vyhledávání MongoDB

  4. Chyba databáze MongoDB:zmizela databáze