从两个 CSV 文件中聚合 MongoDB 中的文档
Aggregate document in MongoDB from two CSV files
我正在编写一个 Java 程序来将两个 CSV 文件插入到一个包含子文档的文档中,但我不知道该怎么做。我会解释:
我有一个包含字段 rsid
、chr
、has_sig
的 SNP 文件和一个包含字段 rsid
、mrna_acc
、gene
的 LOCUS 文件class
, sap_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
属性包含一个子文档数组...
locus: [
{ mrna_acc: NM_00125,
gene: ETS2,
class: utr_variant
},
{ mrna_acc: NM_00126,
gene: ETS2,
class: utr_variant
}
]
这表明 FileLocus
reader 应该为 locus.csv
中的每一行生成一个 Document
实例,并且这些文档中的每一个都应该添加到一个集合中在外部文档中:d
由 FileSnp
reader.
创建
如果是,则应将 FileLocus
块替换为以下内容:
// this will contain the collection of documents, one for each line in `locus.csv`
List<Document> locusDocuments = new ArrayList<>();
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();
// create and populate a sub document for the current line
Document locusDocument = new Document();
locusDocument.append("mrna_acc", fl.mrna_acc);
locusDocument.append("gene", fl.gene);
locusDocument.append("class", fl.classe);
// assign the current sub document to the collection of locus documents
locusDocuments.add(locusDocument);
}
}
// add the collection of locus documents to the outer document
d.append("locus", locusDocuments);
我正在编写一个 Java 程序来将两个 CSV 文件插入到一个包含子文档的文档中,但我不知道该怎么做。我会解释:
我有一个包含字段 rsid
、chr
、has_sig
的 SNP 文件和一个包含字段 rsid
、mrna_acc
、gene
的 LOCUS 文件class
, sap_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
属性包含一个子文档数组...
locus: [
{ mrna_acc: NM_00125,
gene: ETS2,
class: utr_variant
},
{ mrna_acc: NM_00126,
gene: ETS2,
class: utr_variant
}
]
这表明 FileLocus
reader 应该为 locus.csv
中的每一行生成一个 Document
实例,并且这些文档中的每一个都应该添加到一个集合中在外部文档中:d
由 FileSnp
reader.
如果是,则应将 FileLocus
块替换为以下内容:
// this will contain the collection of documents, one for each line in `locus.csv`
List<Document> locusDocuments = new ArrayList<>();
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();
// create and populate a sub document for the current line
Document locusDocument = new Document();
locusDocument.append("mrna_acc", fl.mrna_acc);
locusDocument.append("gene", fl.gene);
locusDocument.append("class", fl.classe);
// assign the current sub document to the collection of locus documents
locusDocuments.add(locusDocument);
}
}
// add the collection of locus documents to the outer document
d.append("locus", locusDocuments);