2014-12-08 14 views
14

Ben MongoDB içinde boolean bilgileri saklamak için üç ana olanakları bkz: String olarakBoole değerlerini mongodb'de nasıl depolamalıyım?

  1. 0 veya 1
  2. Doğru veya bir Boole

olarak yanlış bir Numarası olarak

  • 0 veya 1 Kullanılan depolama alanı ve sorgulama hızı açısından her yöntemin avantajları/dezavantajları nelerdir?

  • +3

    Neden bir boolean ('true' /' false') dışında _anything_ kullanırsınız? –

    +0

    wellllllllllllllllllll. Söylemek kısa bir hile ya da muamele. true/false değerine karşı null veya undefined değerini -1 olarak değerlendirebilirsiniz. dolayısıyla bir sayı. ancak bir tanesi mongodb'de $ var olan tanımlanmamış değerleri bulabilir. bu yüzden grt avantajı yok. undefined endeksi hariç ... –

    cevap

    23

    (MongoDB'nin sunucu tarafı depolama biçimi, aka "Binary JSON") bir yerel alan türüdür. Booleanlar bir tam sayı veya dizgeden daha az depolama kullanır ve karşılaştırmanın beklenmedik yan etkilerinden kaçınırlar.

    Örneğin, bir MongoDB find() sorguda "1" dize 1 bir sayısal değer veya true bir Boole değeri uymaz. Boole değerlerini kaydetmek istiyorsanız, kesinlikle bir boole tipi kullanın.

    eksiksizliği mongo kabukta (bayt) BSON boyutu Karşılaştırılması:

    // Number (JavaScript double) - 8 bytes 
    > var foo = { a: 1 } 
    > Object.bsonsize(foo) 
    16 
    
    // UTF-8 String - 6 bytes 
    > var foo = { a: '1'} 
    > Object.bsonsize(foo) 
    14 
    
    // 32-bit int - 4 bytes 
    > var foo = { a: NumberInt(1)} 
    > Object.bsonsize(foo) 
    12 
    
    // Boolean - 1 byte 
    > var foo = { a: true} 
    > Object.bsonsize(foo) 
    9 
    

    Not: (alan değerlerini hariç) Yukarıdaki örneklerde JSON nesnenin taban boyutu 8 bayt, Bu nedenle, bildirilen Object.bsonsize() arasındaki fark, alan değerinin gösterimidir.

    0

    Birkaç boolean değeriniz varsa, BSON'un boolean'da yerleşik olarak kullanılması iyi olabilir. Fakat aşağıda görüldüğü gibi, her boolean'ın boyutu 4 bayttır. Bu nedenle, verileriniz çok küçükse (fazladan 4 bayta göre) ve/veya çok sayıda boole sahipseniz, bitwise işlemleri ile bir tamsayı bitmap kullanarak daha iyi olabilirsiniz.

    > var foo = {} 
    > Object.bsonsize(foo) 
    5 
    > foo.a = true 
    true 
    > Object.bsonsize(foo) 
    9 
    > foo.b = true 
    true 
    > Object.bsonsize(foo) 
    13 
    
    +0

    Yanıtımda belirtildiği gibi, temel nesnenin BSON boyutu 8 bayttır (tek bir karakter alan adı dahil, ancak değerler değil); bir Boole değeri 1 bayttır. Birden çok booleanı bit maskelerini kullanarak tek bir tamsayı değerine paketleyebilirsiniz, ancak bu, birkaç baytlık potansiyel tasarruf için ticaret endeksi verimliliği ve şema okunabilirliği sağlar. MongoDB 3.4'te olduğu gibi, bitmask sorguları endeksleri kullanamaz (upvote/watch [SERVER-24749] (https://jira.mongodb.org/browse/SERVER-24749)), bu yüzden, eğer bunlar dahil edilmeyi planlıyorsanız, boole değerleri de önerilir. bir dizindeki alanlar. – Stennie

    İlgili konular