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

Rimodellare l'array archiviato in una raccolta ed esportarlo in CSV

Puoi affrontarlo in diversi modi.

Innanzitutto, se hai MongoDB 3.4 disponibile, puoi utilizzare un "View" per rappresentare la collezione con il contenuto dell'array "un-wound". Una "Vista" è fondamentalmente un'istruzione della pipeline di aggregazione che sembra essere una raccolta normale per quanto riguarda la maggior parte delle azioni che utilizzerebbe una raccolta.

Quindi supponendo che la tua raccolta di origine si chiami "pages" qui, quindi creeresti la "Vista" con:

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

Quindi puoi interrogare la raccolta normalmente:

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

E successivamente emettere il mongoexport come se fosse una normale collezione:

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

Ovviamente aggiungendo --out o un reindirizzamento standard per l'output effettivo su un file.

Se il tuo MongoDB è una versione precedente ma almeno ha $out disponibile ( da MongoDB 2.6 ) quindi scrivi in ​​un'altra raccolta:

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

Quindi esegui praticamente lo stesso mongoexport come sopra poiché è anche una raccolta accessibile per farlo.

Se davvero non vuoi creare né una "Visualizza" né "un'altra raccolta", puoi semplicemente inviare un breve script a mongo guscio. Anche se in modo molto ingannevole:

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

O anche senza aggregate() e $unwind affatto:

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

Che ti dà lo stesso output:

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

Nota anche che se vuoi o "hai bisogno" di un delimitatore diverso dalla virgola , qui, quindi uno degli ultimi due approcci con la shell è probabilmente la strada da percorrere. Poiché questo è "programmato" per l'aggiunta a mongoexport e mongoimport con TOOLS-87 , ma ovviamente è "ancora da risolvere". Quindi, se vuoi un output diverso, fallo da solo.