从两个CSV文件聚合MongoDB中的文档

时间:2018-02-28 09:47:51

标签: java mongodb mongodb-java

我正在编写一个Java程序,将两个CSV文件插入到一个由子文档组成的文档中,但我不知道该怎么做。我将解释: 我有一个SNP文件,其中包含字段rsidchrhas_sig以及包含字段rsidmrna_accgene的LOCUS文件, classsap_id在LOCUS文件中,每个rsid可以对应更多mrna_acc,因此我会有更多行具有相同的rsid

我想要一份Mongo文件:

{ _id: ObjectId("7264958211f41a0c647c47b1"),
  rsid: rs530,
  chr: 21,
  has_sig: false,
  locus: [
  { mrna_acc: NM_00125,
    gene: ETS2,
    class: utr_variant
  }, 
  { mrna_acc: NM_00126,
    gene: ETS2,
    class: utr_variant
  }, 
  ... ]
}

我尝试用buffereader读取两个CSV文件并将其插入文档中,如下所示:

Document d = new Document();
Document d1 = new Document();

FileSnp fs = new FileSnp("/Users/valentinafratini/Documents/Progetto Tesi/FactoryMethodDb/snp.csv");
    fs.readFile();
    long startTime = System.currentTimeMillis();
    while (fs.line!=null) {
        fs.line = fs.reader.readLine();

        if (fs.line!=null && fs.line.length()>0) {
            fs.obj = fs.line.split("\\s+");
            fs.readSingleObj();

            d.append("rsid", fs.rsid);
            d.append("chr", fs.chr);
            d.append("has_sig", fs.has_sig);
        }
    }

FileLocus fl = new FileLocus("/Users/valentinafratini/Documents/Progetto Tesi/FactoryMethodDb/locus.csv");
    fl.readFile();
    while (fl.line!=null) {
        fl.line = fl.reader.readLine();

        if (fl.line!=null && fl.line.length()>0) {
            fl.obj = fl.line.split("\\s+");
            fl.readSingleObj();

            d1.append("mrna_acc", fl.mrna_acc);
            d1.append("gene", fl.gene);
            d1.append("class", fl.classe);
        }
    }

d.put("locus", d1);
list.add(d);
coll.insertMany(list);

但结果是插入了一行包含snp文件和locus文件的所有字段。

你能帮帮我吗?我真的不知道该怎么做。 非常感谢你。

1 个答案:

答案 0 :(得分:0)

在目标文档结构中,locus属性包含一系列子文档...

locus: [
  { mrna_acc: NM_00125,
    gene: ETS2,
    class: utr_variant
  }, 
  { mrna_acc: NM_00126,
    gene: ETS2,
    class: utr_variant
  } 
]

这表明FileLocus读者应该为Document中的每一行生成一个locus.csv实例,并且每个文档都应该添加到外部文档中的一个集合中:{ {1}}由d读者创建。

如果是,那么您应该用以下内容替换FileSnp块:

FileLocus