MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB:Jak zmienić nazwę pola za pomocą wyrażenia regularnego?

To nie jest operacja mapReduce, chyba że chcesz mieć nową kolekcję składającą się tylko z _id i wartość pola, które są tworzone z danych wyjściowych mapReduce, podobnie jak:

    "_id": ObjectId("53f2b954b55e91756c81d3a5"), 
    "value": { 
        "domain": "example.com",
        ... 
    } 
}

Co w najlepszym wypadku jest rodzajem przeróbki twojej kolekcji „po stronie serwera”, ale oczywiście nie w takiej strukturze, jaką chcesz.

Chociaż istnieją sposoby na wykonanie całego kodu na serwerze, nie próbuj tego robić, chyba że naprawdę jesteś w miejscu. Te sposoby generalnie i tak nie sprawdzają się dobrze w przypadku shardingu, co zwykle ma miejsce, gdy ludzie „naprawdę są w miejscu” ze względu na sam rozmiar rekordów.

Jeśli chcesz coś zmienić i zrobić to zbiorczo, zazwyczaj musisz „zapętlić” wyniki zbierania i przetwarzać aktualizacje, mając dostęp do bieżących informacji o dokumencie. To znaczy w przypadku, gdy twoja "aktualizacja" jest "oparta na" informacjach już zawartych w polach lub strukturze dokumentu.

W związku z tym nie jest dostępna operacja „zastępowania wyrażenia regularnego” iz pewnością nie ma możliwości zmiany nazwy pola. Zróbmy więc pętlę z operacjami zbiorczymi dla "najbezpieczniejszej" formy robienia tego bez uruchamiania kodu na serwerze.

var bulk = db.collection.initializeOrderedBulkOp();
var counter = 0;

db.collection.find().forEach(function(doc) {

    for ( var k in doc ) {
        if ( doc[k].match(/^2014.*/) ) {
            var update = {};
            update["$unset"][k] = 1;
            update["$set"][ k.replace(/(\d+)-(\d+)-(\d+).+/,"$1$2$3") ] = doc[k];
            bulk.find({ "_id": doc._id }).updateOne(update);
            counter++;
        }
    }

    if ( counter % 1000 == 0 ) {
        bulk.execute();
        bulk = db.collection.initializeOrderedBulkOp();
    }

});

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

Więc główne rzeczy to $unset operatora, aby usunąć istniejące pole i $set operatora, aby utworzyć nowe pole w dokumencie. Potrzebujesz treści dokumentu, aby zbadać i użyć zarówno „nazwy pola”, jak i „wartości”, więc stąd zapętlenie, ponieważ nie ma innego sposobu.

Jeśli nie masz na serwerze MongoDB 2.6 lub nowszego, koncepcja pętli nadal pozostaje bez natychmiastowej poprawy wydajności. Możesz zajrzeć do rzeczy takich jak .eval() w celu przetworzenia na serwerze, ale jak sugeruje dokumentacja, naprawdę nie jest to zalecane. Używaj ostrożnie, jeśli musisz.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak wstawić plik binarny do mongodb za pomocą javascript?

  2. Jak wyszukiwać tekst w mgo?

  3. MongoDB — Aktualizuj obiekt w zagnieżdżonej tablicy

  4. MongoDB $arrayToObject

  5. Mongoengine, odzyskuje tylko część MapField