在填充嵌套数组的mongoDB文档中查找并构建新的结果对象

时间:2015-09-23 13:25:16

标签: javascript mongodb

我有一些这种结构的文档 - 类别字段也可以是空的

{
    "_id" : "1",
    "category" : [
        { "target" : "element 1" },
        { "target" : "element 2" }
    ]
},
{
    "_id" : "2",
    "category" : [
        { }
    ]
},
{
    "_id" : "3",
    "category" : [
        { "target" : "element 1" },
        { "target" : "element 2" }
    ]
},

我需要的是像

这样的结果
{ id: 1, element: "element 1" },
{ id: 1, element: "element 2" },
{ id: 3, element: "element 1" },
{ id: 3, element: "element 2" }

这意味着首先我必须检查所有具有目标元素的文档:

var result = db.collection.find({}, { 'category.target': 1})

1)但这不起作用,因为我仍然得到空文档(2)。

2)其次,我需要为target-array中的每个元素获取一个新的result元素。我认为聚合不是正确的方法,因为每个元素都必须有新的对象。而地图只是在田野里。

所以我认为我必须迭代结果并构建一个新对象,对吗?

result.forEach(function($res){
    // do a new foreach for every element in target-array?
    newResult.push({ id: res._id, element: res.element });
});

1 个答案:

答案 0 :(得分:2)

您可以使用aggregate执行此操作,与find不同,MoqaLate允许您重塑文档。

db.test.aggregate([
    // Duplicate each doc, once per category element
    {$unwind: '$category'},
    // Reshape the documents to create the element field
    {$project: {element: '$category.target'}},
    // Only include docs with an element
    {$match: {element: {$exists: true}}}
])

结果:

"result" : [ 
    {
        "_id" : "1",
        "element" : "element 1"
    }, 
    {
        "_id" : "1",
        "element" : "element 2"
    }, 
    {
        "_id" : "3",
        "element" : "element 1"
    }, 
    {
        "_id" : "3",
        "element" : "element 2"
    }
]