Você pode lidar com isso de várias maneiras.
Em primeiro lugar, se você tiver o MongoDB 3.4 disponível, poderá usar um "View" para representar a coleção com o conteúdo do array "un-wound". Uma "Visualização" é basicamente uma instrução de pipeline de agregação que parece ser uma coleção normal no que diz respeito à maioria das ações que usariam uma coleção.
Portanto, presumindo que sua coleção de fontes seja chamada de
"pages"
aqui, então você criaria a "Visualização" com:db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
Então você pode consultar a coleção 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, posteriormente, emita o
mongoexport
como se fosse uma coleção normal: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
Claro, adicionando
--out
ou um redirecionamento padrão para realmente sair para um arquivo. Se o seu MongoDB for uma versão mais antiga, mas pelo menos tiver
$out
disponível ( do MongoDB 2.6 ) e escreva em outra coleção:db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
Então você basicamente executa o mesmo
mongoexport
como acima, pois também é uma coleção acessível para fazê-lo. Se você realmente não deseja criar uma "Visualização" ou "outra coleção", basta enviar um pequeno script para o
mongo
Concha. Embora de uma maneira muito hacky: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}`))'
Ou mesmo sem
aggregate()
e $unwind
de forma alguma: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}`)))'
O que lhe dá a mesma saída:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
Observe também que, se você quiser ou "precisar" de um delimitador diferente da vírgula
,
aqui, então qualquer uma das duas últimas abordagens com o shell é provavelmente o caminho a seguir. Como isso está "agendado" para adição ao mongoexport
e mongoimport
com TOOLS-87
, mas é claro que "ainda está para ser resolvido". Então, se você quiser uma saída diferente, faça você mesmo.