MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Rimozione degli spazi bianchi (iniziali e finali) dal valore della stringa

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.