sql >> Databasteknik >  >> NoSQL >> MongoDB

Omforma array som lagras i en samling och exportera till CSV

Du kan hantera detta på flera sätt.

För det första om du har MongoDB 3.4 tillgängligt kan du använda en "View" för att representera samlingen med arrayinnehållet "un-wound". En "View" är i grunden en aggregeringspipeline-sats som verkar vara en normal samling vad gäller de flesta åtgärder som skulle använda en samling.

Så förutsatt att din källsamling kallas "pages" här, då skulle du skapa "vyn" med:

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

Sedan kan du fråga samlingen som vanligt:

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

Och utfärda sedan mongoexport som om det vore en vanlig 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

Naturligtvis lägga till --out eller en standardomdirigering för att faktiskt mata ut till en fil.

Om din MongoDB är en äldre version men åtminstone har $out tillgänglig (från MongoDB 2.6) skriv sedan till en annan samling:

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

Då kör du i princip samma mongoexport som ovan eftersom det också är en samling som är tillgänglig för att göra det.

Om du verkligen inte vill skapa varken en "Visa" eller "en annan samling", kan du helt enkelt skicka ett kort skript till mongo skal. Om än på ett väldigt hackigt sätt:

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 till och med utan aggregate() och $unwind alls:

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

Vilket ger dig samma utdata:

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

Observera också att om du vill ha eller "behöver" en annan avgränsare än komma , här, då är förmodligen någon av de två sista infallsvägarna med skalet rätt väg att gå. Eftersom detta är "schemalagt" för tillägg till mongoexport och mongoimport med TOOLS-87 , men är naturligtvis "ännu inte löst". Så om du vill ha olika utdata, så gör du det själv.




  1. Till vilken nivå låser MongoDB skrivningar? (eller:vad betyder det per anslutning

  2. Anropa en lagrad procedur i MongoDB via C#

  3. MongoDB LinQ Select-metoden hämtar verkligen bara en delmängd av fält?

  4. Hur utför man en värdebaserad Order By i MongoDB?