我对mongoDB相当新,但是我已经设法使用聚合管道将大量文档存档到以下格式的名为documents_archived的新集合中:
{
"_id" : ObjectId("5a0046ef2039404645a42f52"),
"archive" : [
{
"_id" : ObjectId("54e60f49e4b097cc823afe8c"),
"_class" : "xxxxxxxxxxxxx",
"fields" : [
{
"key" : "Agreement Number",
"value" : "1002465507"
}
{
"key" : "Name",
"value" : "xxxxxxxx"
}
{
"key" : "Reg No",
"value" : "xxxxxxx"
}
{
"key" : "Surname",
"value" : "xxxxxxxx"
}
{
"key" : "Workflow Id",
"value" : "xxxxxxxx"
}
],
"fileName" : "Audit_C1002465507.txt",
"type" : "Workflow Audit",
"fileSize" : NumberLong(404),
"document" : BinData(0, "xxxxx"),
"creationDate" : ISODate("2009-09-25T00:00:00.000+0000"),
"lastModificationDate" : ISODate("2015-02-19T16:28:57.016+0000"),
"expiryDate" : ISODate("2018-09-25T00:00:00.000+0000")
}
]
}
现在,我试图仅提取协议编号的值。但是,我尝试了许多我有限的知识,搜索和文档所允许的内容。想知道那里的mongoDB专家是否可以提供帮助。谢谢。
答案 0 :(得分:0)
您可以在mongo shell中使用以下内容来仅提取值:
db.documents_archived.find().forEach(function(doc) {
doc.archive[0].fields.forEach(function(field) {
if (field.key == "Agreement Number") {
print(field.value)
}
})
})
答案 1 :(得分:0)
这是一个使用agg框架的解决方案。我假设每个文档在archive
字段中可以有多个条目,但在字段数组中只有一个Agreement Number
,因为您的设计似乎是键/值。如果在字段数组中显示多个Agreement Numbers
,我们将不得不添加额外的$unwind
,但目前这应该有效:
db.foo.aggregate([
{$unwind: "$archive"}
,{$project: {x: {$filter: {
input: "$archive.fields",
as: "z",
cond: {$eq: [ "$$z.key", "Agreement Number" ]}
}}
}}
,{$project: {_id:false, val: {$arrayElemAt: ["$x.value",0]} }}
]);
{ "val" : "1002465507" }