sql >> Database >  >> NoSQL >> MongoDB

Vorm een ​​matrix die is opgeslagen in een verzameling en exporteer naar CSV

Je kunt hier op verschillende manieren mee omgaan.

Ten eerste, als je MongoDB 3.4 beschikbaar hebt, kun je een "View" gebruiken om de collectie weer te geven met de array-inhoud "un-wound". Een "Weergave" is in feite een aggregatiepijplijninstructie die een normale verzameling lijkt te zijn voor zover het de meeste acties betreft die een verzameling zouden gebruiken.

Dus in de veronderstelling dat uw bronverzameling "pages" wordt genoemd hier, dan zou je de "View" maken met:

db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])

Vervolgens kunt u de verzameling op de normale manier opvragen:

db.pageArray.find()

/* 1 */
{
    "_id" : ObjectId("4725bf8731b8faf4c04595bb"),
    "user_id" : "0939bf9w9804842f9f817ad100",
    "page_likes" : {
        "id" : "859302873383",
        "name" : "Hotdogs"
    }
}

/* 2 */
{
    "_id" : ObjectId("4725bf8731b8faf4c04595bb"),
    "user_id" : "0939bf9w9804842f9f817ad100",
    "page_likes" : {
        "id" : "8593683902",
        "name" : "Video Games"
    }
}

/* 3 */
{
    "_id" : ObjectId("4725bf8731b8faf4c04595bb"),
    "user_id" : "0939bf9w9804842f9f817ad100",
    "page_likes" : {
        "id" : "849204859849028",
        "name" : "Road Bikes"
    }
}

En geef vervolgens de mongoexport . uit alsof het een normale verzameling is:

mongoexport -d test -c pageArray --type=csv --fields user_id,page_likes.id,page_likes.name
2017-07-05T13:14:11.588+1000    connected to: localhost
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
2017-07-05T13:14:11.589+1000    exported 3 records

Natuurlijk toevoegen van --out of een standaard omleiding om daadwerkelijk naar een bestand te gaan.

Als uw MongoDB een oudere versie is maar tenminste $out . heeft beschikbaar (vanaf MongoDB 2.6) en schrijf vervolgens naar een andere verzameling:

db.pages.aggregate([
  { "$unwind": "$page_likes" },
  { "$project": { "_id": 0 } },
  { "$out": "pagesArray" }
])

Dan voer je in principe dezelfde mongoexport uit zoals hierboven, omdat het ook een verzameling is die hiervoor toegankelijk is.

Als je echt geen "View" of "een andere collectie" wilt maken, dan kun je gewoon een kort script naar de mongo sturen. schelp. Zij het op een zeer hacky manier:

mongo --quiet --eval '
    print("user_id,page_likes.id,page_likes.name");
    db.pages.aggregate([ 
      { "$unwind": "$page_likes" },
      { "$project": { "_id": 0 } },
    ]).forEach(p => print(`${p.user_id},${p.page_likes.id},${p.page_likes.name}`))'

Of zelfs zonder aggregate() en $unwind helemaal niet:

mongo --quiet --eval '
    print("user_id,page_likes.id,page_likes.name");
    db.pages.find({},{ _id: 0 }).forEach(p =>
       p.page_likes.forEach(l => print(`${p.user_id},${l.id},${l.name}`)))'

Wat je dezelfde output geeft:

user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes

Merk ook op dat als je een ander scheidingsteken wilt of "nodig hebt" dan de komma , hier, dan is een van de twee laatste benaderingen met de schaal waarschijnlijk de beste keuze. Aangezien dit is "gepland" voor toevoeging aan mongoexport en mongoimport met TOOLS-87 , maar is natuurlijk "nog niet opgelost". Dus als je een andere output wilt, dan doe je dat zelf.




  1. MeteorJS-sjabloon toont geen gegevens, verschijnt niet

  2. Hoe toe te voegenToSet met datumveld

  3. Sla meerdere afbeeldingsbestanden op met Kartik FileInput Widget

  4. Mongodb geaggregeerde query op specifieke records in plaats van verzameling