2016-06-09 1 views
3

Je dois mettre à jour la valeur de Profession_id de chaîne à ObjectId pour tous les documents dans une collection de MongoDB.Modification de la valeur du document de chaîne à l'aide ObjectId requête Mise à jour

Ma collection Profession est (Ici, je collais seulement 2 documents, en temps réel, je vais avoir plus de 10K Documents)

{ 
    "_id" : ObjectId("575845a713d284da0ac2ee81"), 
    "Profession_id" : "575841b313d284da0ac2ee7d", 
    "Prof_Name" : "Chief Officer" 
} 

{ 
    "_id" : ObjectId("575845d213d284da0ac2ee82"), 
    "Profession_id" : "575841b313d284da0ac2ee7d", 
    "Prof_Name" : "Executive Officer" 
} 

me aider Veuillez comment mettre à jour la valeur de MongoDB.

Répondre

2

Nous avons besoin de parcourir le snapshot() de nos documents et mettre à jour chaque document en utilisant l'opérateur de mise à jour $set. Et pour ce faire, nous utilisons un fonctionnement en vrac pour une efficacité maximale.

A partir de MongoDB 3.2, nous avons besoin d'utiliser la méthode bulkWrite()

var requests = [];  
let cursor = db.collection.find({}, { "Profession_id": 1 }).snapshot(); 
cursor.forEach(document => { 
    requests.push({ 
     "updateOne": { 
      "filter": { "_id": document._id }, 
      "update": { "$set": { "Profession_id": ObjectId(document.Profession_id) } } 
     } 
    }); 
    if (requests.length === 1000) { 
     // Execute per 1000 operations and re-init 
     db.collection.bulkWrite(requests); 
     requests = []; 
    } 
}); 

// Clean up queues 
if (requests.length > 0) 
    db.collection.bulkWrite(requests);  

De MongoDB 3.0 vous à 2,6 devez utiliser l'API Bulk maintenant dépréciée et associé method.

var bulk = db.collection.initializeUnorderedBulkOp(); 
var count = 0; 

var cursor = db.collection.find({}, { "Profession_id": 1 }).snapshot() 

cursor.forEach(function(document) { 
    bulk.find({ "_id": document._id }).updateOne({ 
     "$set: { "Profession_id": ObjectId(document.Profession_id) } 
    }); 
    count++; 
    if (count % 1000 === 0) { 
     // Execute per 1000 operations and re-init 
     bulk.execute(); 
     bulk = db.collection.initializeUnorderedBulkOp(); 
    } 
}); 

// Clean up queues 
if (count > 0) 
    bulk.execute();