如何将数据作为数组从.csv文件导入到Atlas中的mongodb集合中?

llycmphe  于 2023-04-18  发布在  Go
关注(0)|答案(1)|浏览(141)

我想将数据导入到Atlas示例中的mongodb集合中,其中一些数据存储在数组中。数据最初存储在.csv文件中的表中,如下所示:
| 名称|年龄|兴趣0|兴趣1|兴趣2|
| --------------|--------------|--------------|--------------|--------------|
| 大卫|二十四|慢跑|游泳||
| 莎拉|四十三|电影|足球|无挡板篮球|
如果我通过compass导入它,它会正确导入,数据看起来像这样:

{
 name : 'David',
 age:24, 
 interests : [
    0: "Jogging",
    1: "Swimming",
 ]
},
{
 name : 'Sarah',
 age:43, 
 interests : [
    0: "Movies",
    1: "Football",
    2: "Netball"
 ]
}

但是compass需要我手动选择每一列的类型,这很耗时。如果我使用mongoimport和以下命令:

mongoimport --uri 'mongodb+srv://cluster0.xxx.mongodb.net/my_db' \
   --username='user' \
   --collection='my_collection' \
   --ignoreBlanks \
   --type=csv \
   --headerline \
   --file=/url-to-my-data/data.csv

它不需要手动选择数据类型,但兴趣列成为一个对象,例如:

interests : {
    0: "Movies",
    1: "Football",
    2: "Netball"
}

如何从.csv文件中导入当前格式的数据,但避免指南针要求的手动数据类型选择,并将兴趣列保持为数组?

jjjwad0x

jjjwad0x1#

我找到的最简单的解决方案是使用mongoImport导入数据,并在导入后将对象修改为数组,如下所示:
1.使用mongoImport导入.csv,如上面的问题所示。
1.使用mongosh访问Atlas示例
1.使用以下命令将interests对象更新为数组:

db.my_collection.find({}).forEach(doc => {   
    if(doc.interests){
        let interestsArray = Object.values(doc.interests); 
        db.my_collection.updateOne({"_id": doc._id}, [{$set:{ "interests" : interestsArray}}]); 
    }
});

if语句用于检查文档是否有interests字段,否则Object.values()将抛出错误。如果使用它来修改大量文档,并且某些文档可能没有interests字段,则这很有用,因为命令将在第一个没有interests字段的文档上停止。

相关问题