MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Array umformen, das in einer Sammlung gespeichert ist, und in CSV exportieren

Sie können auf verschiedene Weise damit umgehen.

Erstens, wenn Sie MongoDB 3.4 zur Verfügung haben, können Sie einen "View" verwenden um die Sammlung mit dem Array-Inhalt "un-wound" darzustellen. Eine "Ansicht" ist im Grunde eine Aggregation-Pipeline-Anweisung, die für die meisten Aktionen, die eine Sammlung verwenden würden, eine normale Sammlung zu sein scheint.

Angenommen, Ihre Quellsammlung heißt "pages" hier, dann würden Sie die "Ansicht" erstellen mit:

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

Dann können Sie die Sammlung wie gewohnt abfragen:

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

Geben Sie anschließend mongoexport aus als wäre es eine normale Sammlung:

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

Natürlich --out hinzufügen oder eine Standardumleitung zur tatsächlichen Ausgabe in eine Datei.

Wenn Ihre MongoDB eine ältere Version ist, aber mindestens $out hat verfügbar (ab MongoDB 2.6 ), dann in eine andere Sammlung schreiben:

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

Dann führen Sie im Grunde denselben mongoexport aus wie oben, da es sich auch um eine Sammlung handelt, auf die zugegriffen werden kann.

Wenn Sie wirklich weder eine "Ansicht" noch eine "andere Sammlung" erstellen möchten, können Sie einfach ein kurzes Skript an mongo senden Hülse. Wenn auch auf sehr abgehackte Weise:

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

Oder sogar ohne aggregate() und $unwind überhaupt:

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

Was Ihnen die gleiche Ausgabe gibt:

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

Beachten Sie auch, dass Sie ein anderes Trennzeichen als Komma , wollen oder "benötigen". hier, dann ist wahrscheinlich einer der beiden letzten Ansätze mit der Shell der richtige Weg. Da dies für die Hinzufügung zu mongoexport "geplant" ist und mongoimport mit TOOLS-87 , ist aber natürlich "noch zu lösen". Wenn Sie also eine andere Ausgabe wünschen, können Sie dies selbst tun.