MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDb - Променете типа от Int на Double

По подразбиране всички „числа“ се съхраняват като „двойни“ в MongoDB, освен ако обикновено не се прехвърлят по друг начин.

Вземете следните проби:

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

Това дава колекция като тази:

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

Въпреки различните функции на конструктора, обърнете внимание как няколко от точките с данни изглеждат почти еднакви. Самата обвивка на MongoDB не винаги прави ясно разграничение между тях, но има начин, по който можете да разберете.

Разбира се, има $type оператор на заявка, който позволява избор на типове BSON.

Така че тествайте това с Тип 1 - Което е "двойно":

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

Виждате, че и първото вмъкване, и последното са избрани, но, разбира се, не и другите две.

Така че сега тествайте за BSON тип 16 - което е 32-битово цяло число

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

Това беше "третото" вмъкване, което използва NumberInt() функция в обвивката. Така че тази функция и друга сериализация от вашия драйвер могат да задават този конкретен тип BSON.

И за BSON тип 18 - което е 64-битово цяло число

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

„Второто“ вмъкване, което е конструирано чрез NumberLong() .

Ако искате да „отсечете“ неща, които „не са двойни“, тогава бихте направили:

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

Които са единствените други валидни числови типове, различни от самия "double".

Така че, за да ги „конвертирате“ в колекцията си, можете да „обработите групово“ по следния начин:

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();

Това, което прави, се извършва в три стъпки „в насипно състояние“:

  1. Прехвърляне на стойността към ново поле като „двойно“
  2. Премахнете старото поле с нежелания тип
  3. Преименувайте новото поле на старото име на поле

Това енеобходимо тъй като информацията за типа BSON е "залепена" за полето елемент, веднъж създаден. Така че, за да „преиздадете“, трябва напълно да премахнете старите данни, които включват оригиналното присвояване на полето.

Така че това трябва да обясни как да „откривате“ и също така да „прехвърляте“ нежелани типове във вашите документи.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Търсене на низ със специални символи в документ на MongoDB

  2. Свързване с MongoDB Atlas с помощта на Golang mgo:Постоянен няма достъпен сървър за набор от реплика

  3. Монго подреждане по дължина на масива

  4. Mongo как да $търси с DBRef

  5. Как да инсталирам по-ранна версия на mongodb с homebrew?