Đối với tôi, cách đơn giản nhất để tìm ra cách định dạng "CSV" của bạn cho mongoimport
là chỉ cần tạo một bộ sưu tập, sau đó sử dụng mongoexport
vào đó để xem định dạng CSV sẽ như thế nào.
Vì vậy, hãy tạo tài liệu của bạn từ shell:
db.newcol.insert({
id:"122234343",
name: "name1",
children: ["222334444","333344444"]
})
Sau đó thoát khỏi shell và chạy mongoexport
:
mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv
Nó sẽ hiển thị cho bạn đầu ra là:
id,name,children
122234343,name1,"[""222334444"",""333344444""]"
Trong đó "mảng" được biểu diễn bằng "chuỗi" và sử dụng dấu ngoặc kép ""
ở dạng thoát của chúng.
Đó bây giờ là một nơi khá rõ ràng để sử dụng mongoimport
từ, vì vậy chỉ cần "nhập" ngay bây giờ để kiểm tra:
mongoimport -d test -c newcol --headerline --type csv out.csv
Vào lại shell và xem (các) tài liệu trong bộ sưu tập mới:
db.newcol.findOne()
{
"_id" : ObjectId("59476924d6eb0b7d6ac37e02"),
"id" : 122234343,
"name" : "name1",
"children" : "[\"222334444\",\"333344444\"]"
}
Vì vậy, mọi thứ đều ở đó, NHƯNG các con được liệt kê dưới dạng một "chuỗi" chứ không phải là một mảng. Nhưng đây thực sự không phải là vấn đề, vì chúng tôi đã nhập dữ liệu và bây giờ chỉ là do chúng tôi thực sự biến đổi nó:
var ops = [];
db.testcol.find({ "children": { "$type": 2} }).forEach(doc => {
var children = doc.children.split(',').map( e => e.replace(/"|\[|\]|\\/gm,'').toString() );
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "children": children } }
}
});
if ( ops.length >= 1000 ) {
db.newcol.bulkWrite(ops);
ops = [];
}
});
if ( ops.length > 0 ) {
db.newcol.bulkWrite(ops);
ops = [];
}
Vì vậy, điều đó sẽ lặp lại bất kỳ thứ gì đã được nhập vào bộ sưu tập có loại BSON 2 là "string" thông qua $type
toán tử truy vấn.
Sau đó, chúng tôi lấy chuỗi, chia nó thành một mảng và loại bỏ các ký tự khác để chỉ để lại giá trị bạn muốn.
Sử dụng .bulkWrite()
bạn cam kết những cập nhật đó một cách hiệu quả, thay vì viết từng tài liệu đơn lẻ cho mỗi yêu cầu. Chúng thực sự được gửi theo lô 1000 đến máy chủ.
Kết quả cuối cùng là tài liệu ở dạng mong muốn ban đầu:
db.testcol.findOne()
{
"_id" : ObjectId("5947652ccb237bd6e4e902a5"),
"id" : "122234343",
"name" : "name1",
"children" : [
"222334444",
"333344444"
]
}
Vì vậy, đó là "từng bước" của tôi về cách bạn có thể tìm ra định dạng CSV của mình, nhập nó và sau đó "chuyển đổi" dữ liệu sang trạng thái mà bạn cần.