我有一个存储在Mongo数据库/ JSON文件中的Facebook页面喜欢的集合(标题为喜欢的页面).以下是一个条目的示例.
{
"_id" : ObjectId("4725bf8731b8faf4c04595bb"),
"user_id" : "0939bf9w9804842f9f817ad100",
"page_likes" : [
{
"id" : "859302873383",
"name" : "Hotdogs"
},
{
"id" : "8593683902",
"name" : "Video Games"
},
{
"id" : "849204859849028",
"name" : "Road Bikes"
}
]
}
id =唯一的Facebook页面标识符,name =一个Facebook页面的名称.
我想将整个集合导出到一个具有三列的CSV文件,即user_id,page_likes.id,page_likes.name.它看起来像下面的样子:
user_id page_likes.id page_likes.name
0939bf9w9804842f9f817ad100 859302873383 Hotdogs
0939bf9w9804842f9f817ad100 8593683902 Video Games
0939bf9w9804842f9f817ad100 849204859849028 Road Bikes
... ... ...
JSON文件很大(4GB),包含超过12万名用户,并且条目数没有限制.
尽管聚合框架似乎最有用(可能是项目和展开功能),但我尝试过mongoexport并失败了.也就是说,我对Mongo的经验很少.
任何建议,示例或建议都将非常有帮助.
非常感谢,
[R
解决方法:
您可以通过多种方式处理此问题.
首先,如果您有可用的MongoDB 3.4,则可以使用“View”来表示具有数组内容“ un-wound”的集合.就大多数将使用集合的操作而言,“视图”基本上是一条聚合管道语句,似乎是一个正常的集合.
因此,假设您的源集合在此处称为“页面”,则可以使用以下命令创建“视图”:
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
如果您的MongoDB是较旧的版本,但是至少有$out可用(来自MongoDB 2.6),请写入另一个集合:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
然后,您基本上运行与上述相同的mongoexport,因为它也是可以访问的集合.
如果您确实不想创建“视图”或“另一个集合”,则只需将一个简短脚本发送到mongo shell.尽管以一种非常怪异的方式:
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
还要注意,如果您想要或“需要”一个与逗号不同的定界符,那么使用shell的最后两种方法中的任何一种都可能是可行的方法.因为这是为“ mongoexport”和“ mongoimport”加上TOOLS-87进行“预定”的,但是当然“尚待解决”.因此,如果您想要不同的输出,那么您可以自己做.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。