sql >> Database teknologi >  >> NoSQL >> MongoDB

Omform array, der er gemt i en samling, og eksporter til CSV

Du kan håndtere dette på en række måder.

For det første, hvis du har MongoDB 3.4 tilgængelig, kan du bruge en "View" for at repræsentere samlingen med array-indholdet "un-wound". En "visning" er dybest set en aggregeringspipeline-erklæring, der ser ud til at være en normal samling, hvad angår de fleste handlinger, der ville bruge en samling.

Så hvis du antager, at din kildesamling hedder "pages" her, så ville du oprette "View" med:

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

Derefter kan du forespørge samlingen som normalt:

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"
    }
}

Og udsted derefter mongoexport som om det var en normal samling:

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

Selvfølgelig tilføjer --out eller en standard omdirigering til faktisk at output til en fil.

Hvis din MongoDB er en ældre version, men i det mindste har $out tilgængelig (fra MongoDB 2.6), så skriv til en anden samling:

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

Så kører du stort set den samme mongoexport som ovenfor, da det også er en samling, der er tilgængelig for at gøre det.

Hvis du virkelig ikke ønsker at oprette enten en "View" eller "en anden samling", så kan du blot sende et kort script til mongo skal. Omend på en meget hacky måde:

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}`))'

Eller endda uden aggregate() og $unwind overhovedet:

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}`)))'

Hvilket giver dig det samme output:

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

Bemærk også, at hvis du ønsker eller "bruger" et andet skilletegn end komma , her, så er en af ​​de to sidste tilgange med skallen nok vejen at gå. Da dette er "planlagt" til tilføjelse til mongoexport og mongoimport med TOOLS-87 , men er selvfølgelig "endnu ikke løst". Så hvis du vil have anderledes output, så gør du det selv.




  1. Hvordan håndterer vi anmodninger prioritet i express/nodejs?

  2. Forbinder MongoDB til Ruby med selvsignerede certifikater til SSL

  3. MongoDB – Medbring dine egne SSL-certifikater

  4. Sådan forbedres MongoDB-indsatsydeevne