2012-08-13 10 views
7

Aplikacja utrzymuje pole Guid w Mongo i kończy się przechowywane jako BinData:Jakie są wady przechowywania Guid jako String w MongoDB?

"_id" : new BinData(3, "WBAc3FDBDU+Zh/cBQFPc3Q==") 

Zaletą w tym przypadku jest zwartość wadą pojawia się, gdy trzeba rozwiązywać aplikacji. Guidy są przekazywane za pośrednictwem URL-i i ciągle zmieniając je na BinData, kiedy przechodzenie do konsoli Mongo jest trochę bolesne.

Jakie są niedogodności związane z przechowywaniem Guida jako ciągu oprócz zwiększenia jego rozmiaru? Jedną z zalet jest łatwość rozwiązywania problemów:

"_id" : "3c901cac-5b90-4a09-896c-00e4779a9199" 

Oto prototyp uporczywego podmiotu w C#:

class Thing 
{ 
    [BsonIgnore] 
    public Guid Id { get; set; } 

    [BsonId] 
    public string DontUseInAppMongoId 
    { 
     get { return Id.ToString(); } 
     set { Id = Guid.Parse(value); } 
    } 
} 
+0

pamięć, przestrzeń i czas zapytań i wielkość indeksu to tylko niektóre, co można zrobić, aby zoptymalizować to: http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-StoreBinaryGUIDsasBinData % 2Cratherthanashexencodedstrings – Sammaye

+0

Co tak naprawdę robisz, przepraszam, nie przeczytałem w pełni pytania. – Sammaye

+0

możesz sprawdzić odpowiedź na pokrewne moje pytanie: http://stackoverflow.com/a/22607171/253098 – SystematicFrank

Odpowiedz

8

Oprócz odpowiedzi Gregor, wykorzystując GUID będzie obecnie uniemożliwić korzystanie z nowych ram Aggregation gdyż jest reprezentowany jako typ binarny. Bez względu na to, możesz zrobić to, co chcesz, w łatwiejszy sposób. Dzięki temu uchwyt biblioteki bonsy monbudb wykona dla ciebie konwersje.

public class MyClass 
{ 
    [BsonRepresentation(BsonType.String)] 
    public Guid Id { get; set;} 
} 
+0

Czy mogę użyć np. BsonString jako typu zmiennej, np. "Public BsonString Name {get; zestaw; } –

+2

Należy zauważyć, że nie jest to już problem z Aggregation Framework w wersji 2.6. –

+0

@Idan, nie używaj BsonString w swoich klasach, używaj ciągów znaków. Kierowca wie, jak serializować do iz nich. –

5

Wadą jest to, że MongoDB jest zoptymalizowany do wykorzystania BSON ObjectID jest tak będzie nieco mniej wydajny używać łańcuchów jako ObjectID. Również jeśli chcesz używać kwerend opartych na zakresie na obiektach typu String ObjectID, użyjesz porównania leksykograficznego, które może dać inne wyniki, niż się spodziewasz. Poza tym możesz używać łańcuchów jako ObjectID. patrz Optymalizacja ObjectIDs http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs