MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Định hình lại tài liệu bằng cách tách một giá trị trường

Cách tối ưu trong MongoDB phiên bản 3.4.

Phiên bản này của mongod cung cấp $ split toán tử, tất nhiên sẽ chia chuỗi như được hiển thị tại đây .

Sau đó, chúng tôi chỉ định giá trị mới được tính cho một biến bằng cách sử dụng $ let toán tử biến. Sau đó, giá trị mới có thể được sử dụng trong in biểu thức để trả về giá trị "name" và "age" bằng cách sử dụng $ arrayElemAt toán tử để trả về phần tử tại một chỉ mục xác định; 0 cho phần tử đầu tiên và -1 cho phần tử cuối cùng.

Lưu ý rằng trong trong biểu thức chúng ta cần tách phần tử cuối cùng để trả về chuỗi số nguyên.

Cuối cùng, chúng ta cần lặp lại Con trỏ và ép kiểu chuyển đổi chuỗi số nguyên thành số bằng cách sử dụng Số hoặc parseInt và sử dụng hoạt động hàng loạt và BulkWrite () phương thức đến $ set giá trị cho các trường đó để đạt hiệu quả tối đa.

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 hoặc mới hơn.

MongoDB 3.2 không dùng nữa Bulk () API và các phương thức được liên kết của nó và cung cấp BulWrite () nhưng nó không cung cấp $ split vì vậy tùy chọn duy nhất mà chúng tôi có ở đây là sử dụng mapReduce () để chuyển đổi dữ liệu của chúng tôi, sau đó cập nhật bộ sưu tập bằng thao tác hàng loạt.

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 phiên bản 2.6 hoặc 3.0.

Chúng tôi cần sử dụng API hàng loạt hiện không được dùng nữa .

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Có thể làm phẳng truy vấn kết quả MongoDB không?

  2. Hoán đổi các giá trị trong một mảng MongoDB

  3. Mongodb:connectToField được tính toán bên trong graphlookup

  4. tar gzip mongo dump như MySQL

  5. MongoDB:Máy chủ có cảnh báo khởi động