Al momento non è possibile per un aggiornamento in MongoDB fare riferimento al valore esistente di un campo corrente quando si applica l'aggiornamento. Quindi dovrai eseguire il loop:
db.collection.find({},{ "category": 1 }).forEach(function(doc) {
doc.category = doc.category.trim();
db.collection.update(
{ "_id": doc._id },
{ "$set": { "category": doc.category } }
);
})
Notando l'uso del $set
operatore lì e il campo "categoria" proiettato solo per ridurre il traffico di rete"
Potresti limitare ciò che elabora con un $regex
da abbinare:
db.collection.find({
"$and": [
{ "category": /^\s+/ },
{ "category": /\s+$/ }
]
})
O anche come puro $regex
senza l'uso di $and
di cui hai solo bisogno in MongoDB in cui più condizioni verrebbero applicate allo stesso campo. Altrimenti $and
è implicito in tutti gli argomenti:
db.collection.find({ "category": /^\s+|\s+$/ })
Ciò limita l'elaborazione dei documenti corrispondenti solo a quelli con spazi bianchi iniziali o finali.
Se sei preoccupato per il numero di documenti da cercare, l'aggiornamento in blocco dovrebbe essere d'aiuto se hai MongoDB 2.6 o versioni successive disponibili:
var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1 }).forEach(
function(doc) {
batch.push({
"q": { "_id": doc._id },
"u": { "$set": { "category": doc.catetgory.trim() } }
});
if ( batch.length % 1000 == 0 ) {
db.runCommand("update", batch);
batch = [];
}
}
);
if ( batch.length > 0 )
db.runCommand("update", batch);
O anche con l'API per le operazioni in blocco per MongoDB 2.6 e versioni successive:
var counter = 0;
var bulk = db.collection.initializeOrderedBulkOp();
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
function(doc) {
bulk.find({ "_id": doc._id }).update({
"$set": { "category": doc.category.trim() }
});
counter = counter + 1;
if ( counter % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
}
);
if ( counter > 1 )
bulk.execute();
Il migliore fatto con bulkWrite()
per le moderne API che utilizzano l'API Bulk Operations (tecnicamente tutto lo fa ora ) ma in realtà in un modo che è sicuramente regressivo con versioni precedenti di MongoDB. Anche se in tutta onestà ciò significherebbe prima di MongoDB 2.6 e saresti ben fuori dalla copertura per le opzioni di supporto ufficiali utilizzando una tale versione. La codifica è un po' più pulita per questo:
var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
function(doc) {
batch.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "category": doc.category.trim() } }
}
});
if ( batch.legth % 1000 == 0 ) {
db.collection.bulkWrite(batch);
batch = [];
}
}
);
if ( batch.length > 0 ) {
db.collection.bulkWrite(batch);
batch = [];
}
Che tutti inviano operazioni al server solo una volta per 1000 documenti o tutte le modifiche che puoi inserire sotto il limite di 64 MB BSON.
Come solo alcuni modi per affrontare il problema. Oppure aggiorna il tuo file CSV prima dell'importazione.