Pokud je váš server MongoDB verze 2.6 nebo novější, bylo by lepší využít možnosti zápisu Hromadné API
které umožňují hromadné provedení update
operace, které jsou jednoduše abstrakcemi nad serverem, aby bylo snadné vytvářet hromadné operace. Tyto hromadné operace přicházejí hlavně ve dvou příchutích:
- Objednané hromadné operace . Tyto operace provedou všechny operace v pořadí a při první chybě zápisu dojde k chybě.
- Neuspořádané hromadné operace . Tyto operace provádějí všechny operace paralelně a shromažďují všechny chyby. Neuspořádané hromadné operace nezaručují pořadí provedení.
Všimněte si, že u starších serverů než 2.6 API převede operace dolů. Není však možné převést dolů 100 %, takže se mohou vyskytnout okrajové případy, kdy nemůže správně hlásit správná čísla.
Pro vaše tři běžné případy použití byste mohli implementovat Bulk API takto:
Případ 1. Změňte typ hodnoty vlastnosti, aniž byste změnili hodnotu:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
// Handle error
if(err) throw err;
// Get the collection and bulk api artefacts
var col = db.collection('users'),
bulk = col.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Case 1. Change type of value of property, without changing the value.
col.find({"timestamp": {"$exists": true, "$type": 2} }).each(function (err, doc) {
var newTimestamp = parseInt(doc.timestamp);
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "timestamp": newTimestamp }
});
counter++;
if (counter % 1000 == 0 ) {
bulk.execute(function(err, result) {
// re-initialise batch operation
bulk = col.initializeOrderedBulkOp();
});
}
});
if (counter % 1000 != 0 ){
bulk.execute(function(err, result) {
// do something with result
db.close();
});
}
});
Případ 2 Přidejte novou vlastnost na základě hodnoty stávající vlastnosti:
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
// Handle error
if(err) throw err;
// Get the collection and bulk api artefacts
var col = db.collection('users'),
bulk = col.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Case 2. Add new property based on value of existing property.
col.find({"name": {"$exists": false } }).each(function (err, doc) {
var fullName = doc.firstname + " " doc.lastname;
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "name": fullName }
});
counter++;
if (counter % 1000 == 0 ) {
bulk.execute(function(err, result) {
// re-initialise batch operation
bulk = col.initializeOrderedBulkOp();
});
}
});
if (counter % 1000 != 0 ){
bulk.execute(function(err, result) {
// do something with result
db.close();
});
}
});
Případ 3 Jednoduše přidáte odebrání vlastností z dokumentů.
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
// Handle error
if(err) throw err;
// Get the collection and bulk api artefacts
var col = db.collection('users'),
bulk = col.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Case 3. Simply adding removing properties from documents.
col.find({"street_no": {"$exists": true } }).each(function (err, doc) {
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "no": doc.street_no },
"$unset": { "street_no": "" }
});
counter++;
if (counter % 1000 == 0 ) {
bulk.execute(function(err, result) {
// re-initialise batch operation
bulk = col.initializeOrderedBulkOp();
});
}
});
if (counter % 1000 != 0 ){
bulk.execute(function(err, result) {
// do something with result
db.close();
});
}
});