2015-08-11 4 views
2

Как изменить тип данных поля mongodb от NumberLong до Double?Как изменить тип данных типа mongodb от NumberLong до Double?

Я пытался без успеха:

db.getCollection('mycoll').find({'_id':10150097174480591}).forEach(function (x) { 
    x._id = new Double(x._id); 
    db.getCollection('mycoll').save(x); 
}); 
+2

Параметр '_id' поле неизменна. Вам придется создавать новые документы с помощью нового '_id'. –

ответ

1

"типа" объект должен быть переделкой. Лучше налив, и фильтр с $type:

var bulk = db.users2.initializeOrderedBulkOp(), 
    count = 0; 

db.mycoll.find({ "_id": { "$type": 18 } }).forEach(function(doc) { 
    doc._id = parseInt(doc._id.valueOf()); 
    bulk.insert(doc); 
    count++;  

    if (count % 1000 == 0) { 
     bulk.execute(); 
     bulk = db.users2.initializeOrderedBulkOp(); 
    } 
}); 

if (count % 1000 != 0) 
    bulk.execute(); 

Обратите внимание, что, потому что это _id вам нужна другая коллекция. Если вы пытаетесь сделать с другими полями и в пределах одной и той же коллекции, то вам нужно удалить и «сбросить» поле в документе для того, чтобы произвести изменения:

var bulk = db.mycoll.initializeOrderedBulkOp(), 
    count = 0; 

db.mycoll.find({ "a": { "$type": 18 } }).forEach(function(doc) { 
    doc.a = parseInt(doc.a.valueOf()); 
    bulk.find({ "_id": doc._id }).updateOne({ 
     "$unset": { "a": "" } 
    }); 
    bulk.find({ "_id": doc._id }).updateOne({ 
     "$set": { "a": doc.a } 
    }); 

    count++;  

    if (count % 500 == 0) { 
     bulk.execute(); 
     bulk = db.mycoll.initializeOrderedBulkOp(); 
    } 
}); 

if (count % 500 != 0) 
    bulk.execute(); 
Смежные вопросы