MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Импортирайте csv данни като масив в mongodb, като използвате mongoimport

За мен най-простият начин да разберете как да форматирате своя "CSV" за mongoimport е просто да създадете колекция, след което да използвате mongoexport върху него, за да видите как трябва да изглежда CSV форматът.

Така че създайте своя документ от обвивката:

db.newcol.insert({
  id:"122234343",
  name: "name1",
  children: ["222334444","333344444"]
})

След това излезте от обвивката и стартирайте mongoexport :

 mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv

Което ще ви покаже изхода като:

id,name,children
122234343,name1,"[""222334444"",""333344444""]"

Където "масивът" е представен с "низ" и използвайки кавичките "" в избягалата им форма.

Това сега е доста ясно място за използване на mongoimport от, така че просто „импортирайте“ сега, за да тествате:

mongoimport -d test -c newcol --headerline --type csv out.csv

Влезте отново в обвивката и вижте документа(ите) в новата колекция:

db.newcol.findOne()
{
        "_id" : ObjectId("59476924d6eb0b7d6ac37e02"),
        "id" : 122234343,
        "name" : "name1",
        "children" : "[\"222334444\",\"333344444\"]"
}

Така че всичко е налице,НО децата са посочени като "низ", а не като масив. Но това всъщност не е проблем, тъй като имаме импортирани данни и сега остава само да ги трансформираме:

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 = [];
}

Така че това ще повтори всичко, което е било импортирано в колекцията, което има тип BSON от 2, който е "низ" чрез $type оператор на заявка.

След това вземаме низа, разделяме го като масив и премахваме останалите знаци, за да оставим само желаната от вас стойност.

Използване на .bulkWrite() Вие извършвате тези актуализации по ефективен начин, вместо да пишете всеки един документ на заявка. Те всъщност се изпращат на партиди от 1000 до сървъра.

Крайният резултат е документът в оригиналната желана форма:

db.testcol.findOne()
{
        "_id" : ObjectId("5947652ccb237bd6e4e902a5"),
        "id" : "122234343",
        "name" : "name1",
        "children" : [
                "222334444",
                "333344444"
        ]
}

Така че това е моята „стъпка по стъпка“ за това как можете да разработите своя CSV формат, да го импортирате и след това да „трансформирате“ данните в състоянието, в което имате нужда.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да направя заявки без значение за главни букви в Mongodb?

  2. Какъв е добър избор на база данни за малко .NET приложение?

  3. Заявка за диапазон за пагинация на MongoDB

  4. Вземете само определено поле в MongoDB с C#

  5. Актуализирайте елемента в масива, ако съществува, иначе вмъкнете нов елемент в този масив в MongoDb