Můžete se s tím vypořádat mnoha způsoby.
Za prvé, pokud máte k dispozici MongoDB 3.4, můžete použít "Zobrazit" za účelem reprezentovat kolekci s obsahem pole "un-wound". "View" je v podstatě příkaz agregačního kanálu, který se zdá být normální sbírkou, pokud jde o většinu akcí, které by používaly kolekci.
Za předpokladu, že se vaše zdrojová kolekce nazývá "pages"
zde, pak byste vytvořili "View" pomocí:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
Poté se můžete dotázat na kolekci jako obvykle:
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"
}
}
A následně vydejte mongoexport
jako by to byla normální sbírka:
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
Samozřejmě přidání --out
nebo standardní přesměrování na skutečný výstup do souboru.
Pokud je vaše MongoDB starší verze, ale má alespoň $out
k dispozici (od MongoDB 2.6), poté napište do jiné kolekce:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
Pak v podstatě spustíte stejný mongoexport
jako výše, protože je to také sbírka, která je k tomu přístupná.
Pokud opravdu nechcete vytvářet ani „Zobrazit“ ani „jinou sbírku“, můžete jednoduše poslat krátký skript do mongo
skořápka. I když velmi otřepaným způsobem:
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}`))'
Nebo dokonce bez aggregate()
a $unwind
vůbec:
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}`)))'
Což vám dává stejný výstup:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
Všimněte si také, že pokud chcete nebo "potřebujete" jiný oddělovač než čárka ,
Zde je pravděpodobně správnou cestou jeden ze dvou posledních přístupů s shellem. Protože toto je „naplánováno“ pro přidání do mongoexport
a mongoimport
s TOOLS-87
, ale samozřejmě je "ještě k vyřešení". Pokud tedy chcete jiný výstup, udělejte to sami.