微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-重整形存储在集合中的数组并导出为CSV

我有一个存储在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

当然添加--out或标准重定向以实际输出文件.

如果您的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 举报,一经查实,本站将立刻删除。

相关推荐