これにはさまざまな方法で対処できます。
まず、MongoDB 3.4を利用できる場合は、"View" を使用できます。 配列の内容が「巻き戻された」状態でコレクションを表すため。 「ビュー」は基本的に、コレクションを使用するほとんどのアクションに関する限り、通常のコレクションのように見える集約パイプラインステートメントです。
したがって、ソースコレクションを"pages"
と呼びます。 ここで、次のコマンドで「ビュー」を作成します:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
次に、通常どおりコレクションをクエリできます:
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"
}
}
その後、mongoexport
を発行します 通常のコレクションであるかのように:
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
もちろん、 --out
を追加します
または、実際にファイルに出力するための標準リダイレクト。
MongoDBが古いバージョンであるが、少なくとも$out
がある場合 利用可能(MongoDB 2.6から)、別のコレクションに書き込みます:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
次に、基本的に同じmongoexport
を実行します 上記のように、アクセス可能なコレクションでもあるためです。
「ビュー」または「別のコレクション」を本当に作成したくない場合は、短いスクリプトをmongo
に送信するだけです。 シェル。非常にハッキーな方法ではありますが:
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}`))'
またはaggregate()
がなくても および$unwind
まったく:
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}`)))'
これで同じ出力が得られます:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
また、コンマとは異なる区切り文字が必要または「必要」な場合は、,
にも注意してください。 ここでは、シェルを使用した最後の2つのアプローチのいずれかがおそらく進むべき道です。これはmongoexport
に追加するために「スケジュール」されているため およびmongoimport
TOOLS-87
を使用 、しかしもちろん「まだ解決されていない」です。したがって、別の出力が必要な場合は、自分で行います。