Hiện tại, bản cập nhật trong MongoDB không thể tham chiếu đến giá trị hiện có của trường hiện tại khi áp dụng bản cập nhật. Vì vậy, bạn sẽ phải lặp lại:
db.collection.find({},{ "category": 1 }).forEach(function(doc) {
doc.category = doc.category.trim();
db.collection.update(
{ "_id": doc._id },
{ "$set": { "category": doc.category } }
);
})
Lưu ý việc sử dụng $set
nhà điều hành ở đó và trường "danh mục" dự kiến chỉ để giảm lưu lượng mạng "
Bạn có thể giới hạn những gì xử lý với $regex
để phù hợp với:
db.collection.find({
"$and": [
{ "category": /^\s+/ },
{ "category": /\s+$/ }
]
})
Hoặc thậm chí là $regex
thuần túy mà không sử dụng $and
mà bạn chỉ cần trong MongoDB nơi nhiều điều kiện sẽ được áp dụng cho cùng một trường. Nếu không thì $and
là ngầm đối với tất cả các đối số:
db.collection.find({ "category": /^\s+|\s+$/ })
Điều này hạn chế các tài liệu phù hợp chỉ được xử lý với những tài liệu có khoảng trắng ở đầu hoặc cuối.
Nếu bạn lo lắng về số lượng tài liệu cần xem, cập nhật hàng loạt sẽ hữu ích nếu bạn có sẵn MongoDB 2.6 trở lên:
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);
Hoặc thậm chí với API hoạt động hàng loạt cho MongoDB 2.6 trở lên:
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();
Tốt nhất được thực hiện với bulkWrite()
đối với API hiện đại sử dụng API hoạt động hàng loạt (về mặt kỹ thuật là mọi thứ bây giờ) nhưng thực sự theo cách thoái lui một cách an toàn với các phiên bản MongoDB cũ hơn. Mặc dù thành thật mà nói, điều đó có nghĩa là trước MongoDB 2.6 và bạn sẽ nằm ngoài phạm vi bảo hiểm cho các tùy chọn hỗ trợ chính thức bằng cách sử dụng phiên bản như vậy. Mã hóa có phần gọn gàng hơn cho việc này:
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 = [];
}
Mà tất cả chỉ gửi hoạt động đến máy chủ một lần trên 1000 tài liệu hoặc bao nhiêu sửa đổi bạn có thể vừa với giới hạn 64MB BSON.
Chỉ là một số cách tiếp cận vấn đề. Hoặc cập nhật tệp CSV của bạn trước khi nhập.