mongodb - 在数组

时间:2017-11-07 15:10:02

标签: arrays mongodb

我对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专家是否可以提供帮助。谢谢。

2 个答案:

答案 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" }