sql >> Databasteknik >  >> NoSQL >> MongoDB

Omforma dokument genom att dela upp ett fältvärde

Det optimala sättet i MongoDB version 3.4.

Denna version av mongod tillhandahåller $split operatör som naturligtvis delar upp strängen som visas här .

Vi tilldelar sedan det nyligen beräknade värdet till en variabel med $let variabel operator. Det nya värdet kan sedan användas i in uttryck för att returnera värdena "namn" och "ålder" med hjälp av $arrayElemAt operator för att returnera elementet vid ett specificerat index; 0 för det första elementet och -1 för det sista elementet.

Observera att i in uttryck måste vi dela upp det sista elementet för att returnera strängen med heltal.

Slutligen måste vi iterera Markören objekt och cast konvertera strängen av heltal till numerisk med Nummer eller parseInt och använd bulkoperation och bulkWrite() metod för att $set värdet för dessa fält för maximal effektivitet.

let requests = [];
db.coll.aggregate(
    [
        { "$project": {  
            "person": { 
                "$let": { 
                    "vars": { 
                        "infos":  { "$split": [ "$person", "," ] } 
                    }, 
                    "in": { 
                        "name": { "$arrayElemAt": [ "$$infos", 0 ] }, 
                        "age": { 
                            "$arrayElemAt": [ 
                                { "$split": [ 
                                    { "$arrayElemAt": [ "$$infos", -1 ] }, 
                                    " " 
                                ]}, 
                                -1 
                            ] 
                        } 
                    } 
                } 
            }  
        }}
    ] 
).forEach(document => { 
    requests.push({ 
        "updateOne": { 
            "filter": { "_id": document._id }, 
            "update": { 
                "$set": { 
                    "name": document.person.name, 
                    "age": Number(document.person.age) 
                },
                "$unset": { "person": " " }
            } 
        } 
    }); 
    if ( requests.length === 500 ) { 
        // Execute per 500 ops and re-init
        db.coll.bulkWrite(requests); 
        requests = []; 
    }} 
);

 // Clean up queues
if(requests.length > 0) {
    db.coll.bulkWrite(requests);
}

MongoDB 3.2 eller senare.

MongoDB 3.2 fasar ut den gamla Bulk() API och dess associerade metoder och tillhandahåller bulkWrite() metoden men den tillhandahåller inte $split så det enda alternativet vi har här är att använda mapReduce() metod för att omvandla vår data och sedan uppdatera insamlingen med hjälp av massoperation.

var mapFunction = function() { 
    var person = {}, 
    infos = this.person.split(/[,\s]+/); 
    person["name"] = infos[0]; 
    person["age"] = infos[2]; 
    emit(this._id, person); 
};

var results = db.coll.mapReduce(
    mapFunction, 
    function(key, val) {}, 
    { "out": { "inline": 1 } }
)["results"];

results.forEach(document => { 
    requests.push({ 
        "updateOne": { 
            "filter": { "_id": document._id }, 
            "update": { 
                "$set": { 
                    "name": document.value.name, 
                    "age": Number(document.value.age) 
                }, 
                "$unset": { "person": " " }
            } 
        } 
    }); 
    if ( requests.length === 500 ) { 
        // Execute per 500 operations and re-init
        db.coll.bulkWrite(requests); 
        requests = []; 
    }} 
);

// Clean up queues
if(requests.length > 0) {
    db.coll.bulkWrite(requests);
}

MongoDB version 2.6 eller 3.0.

Vi måste använda det nu utfasade Bulk API .

var bulkOp = db.coll.initializeUnorderedBulkOp();
var count = 0;

results.forEach(function(document) { 
    bulkOp.find({ "_id": document._id}).updateOne(
        { 
            "$set": { 
                "name": document.value.name, 
                "age": Number(document.value.age)
            },
            "$unset": { "person": " " }
        }
    );
    count++;
    if (count === 500 ) {
        // Execute per 500 operations and re-init
        bulkOp.execute();
        bulkOp = db.coll.initializeUnorderedBulkOp();
    }
});

// clean up queues
if (count > 0 ) {
    bulkOp.execute();
}



  1. Mongo aggregeringsramverk, sortera och sedan grupp fungerar inte

  2. Konfigurera pymongo att använda string _id istället för ObjectId

  3. För många öppna filer samtidigt som du säkerställer indexmongo

  4. Topp 10 funktioner i Big Data Hadoop