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

Nhập dữ liệu csv dưới dạng mảng trong mongodb bằng mongoimport

Đố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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách chính xác để bắt đầu một dịch vụ mongod trên linux / OS X là gì?

  2. Cách gọi db.Collection.stats () từ trình điều khiển java Mongo

  3. Làm cách nào để sử dụng một biến làm tên trường trong mongodb-native findOne ()?

  4. Làm thế nào để điền một tài liệu con trong mongoose sau khi tạo nó?

  5. Chọn độ dài chuỗi trong mongodb