MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDb — Zmień typ z Int na Double

Domyślnie wszystkie "liczby" są przechowywane jako "podwójne" w MongoDB, chyba że generalnie rzutowane jest nadmiernie.

Weź następujące próbki:

db.sample.insert({ "a": 1 })
db.sample.insert({ "a": NumberLong(1) })
db.sample.insert({ "a": NumberInt(1) })
db.sample.insert({ "a": 1.223 })

Daje to kolekcję taką jak ta:

{ "_id" : ObjectId("559bb1b4a23c8a3da73e0f76"), "a" : 1 }
{ "_id" : ObjectId("559bb1bba23c8a3da73e0f77"), "a" : NumberLong(1) }
{ "_id" : ObjectId("559bb29aa23c8a3da73e0f79"), "a" : 1 }
{ "_id" : ObjectId("559bb30fa23c8a3da73e0f7a"), "a" : 1.223 }

Pomimo różnych funkcji konstruktora zwróć uwagę, że kilka punktów danych wygląda prawie tak samo. Sama powłoka MongoDB nie zawsze wyraźnie je rozróżnia, ale istnieje sposób, aby to stwierdzić.

Jest oczywiście $type operator zapytań, który umożliwia wybór typów BSON.

Testowanie tego za pomocą Typu 1 — który jest „podwójny”:

> db.sample.find({ "a": { "$type": 1 } })
{ "_id" : ObjectId("559bb1b4a23c8a3da73e0f76"), "a" : 1 }
{ "_id" : ObjectId("559bb30fa23c8a3da73e0f7a"), "a" : 1.223 }

Widzisz, że wybrana jest zarówno pierwsza, jak i ostatnia wstawka, ale oczywiście nie dwie pozostałe.

Więc teraz przetestuj BSON Type 16 - który jest 32-bitową liczbą całkowitą

> db.sample.find({ "a": { "$type": 16 } })
{ "_id" : ObjectId("559bb29aa23c8a3da73e0f79"), "a" : 1 }

To była „trzecia” wstawka, która używała NumberInt() funkcja w powłoce. Tak więc ta funkcja i inna serializacja z twojego sterownika może ustawić ten konkretny typ BSON.

A dla BSON Type 18 - 64-bitowej liczby całkowitej

> db.sample.find({ "a": { "$type": 18 } })
{ "_id" : ObjectId("559bb1bba23c8a3da73e0f77"), "a" : NumberLong(1) }

„Druga” wstawka, która została stworzona za pomocą NumberLong() .

Jeśli chcesz „wyplenić” rzeczy, które nie są „podwójne”, to zrobisz:

db.sample.find({ "$or": [{ "a": { "$type": 16 } },{ "a": { "$type": 18 } }]})

Które są jedynymi poprawnymi typami liczbowymi innymi niż samo „podwójne”.

Aby „przekonwertować” je w swojej kolekcji, możesz wykonać proces „zbiorczo” w ten sposób:

var bulk = db.sample.initializeUnorderedBulkOp(),
    count = 0;
db.sample.find({ 
    "$or": [
        { "a": { "$type": 16 } },
        { "a": { "$type": 18 } }
    ]
}).forEach(function(doc) {
    bulk.find({ "_id": doc._id })
        .updateOne({ 
            "$set": { "b": doc.a.valueOf() } ,
            "$unset": { "a": 1 } 
        });
    bulk.find({ "_id": doc._id })
        .updateOne({ "$rename": { "b": "a" } });
    count++;
    if ( count % 1000 == 0 ) {
        bulk.execute()
        bulk = db.sample.initializeUnOrderedBulkOp();
    }
})
if ( count % 1000 != 0 ) bulk.execute();

To, co to robi, odbywa się w trzech krokach „zbiorczo”:

  1. Przekształć wartość w nowe pole jako „podwójne”
  2. Usuń stare pole z niechcianym typem
  3. Zmień nazwę nowego pola na starą

Jest to konieczne ponieważ informacje o typie BSON są „przyklejone” do utworzonego elementu pola. Tak więc, aby „przekonwertować”, musisz całkowicie usunąć stare dane, które zawierają oryginalne przypisanie pola.

Powinno to wyjaśnić, jak „wykrywać” i „ponownie przesyłać” niechciane typy w dokumentach.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB porównuje daty tylko bez godzin

  2. Zapytanie po wypełnieniu w Mongoose

  3. Dopasowanie pola tablicy, które zawiera dowolną kombinację podanej tablicy w MongoDB

  4. Ustawianie czasu wygaśnięcia kolekcji w mongodb przy użyciu mongoose

  5. Mongo:policz liczbę wystąpień słów w zestawie dokumentów