如何在数组中的嵌入文档中指定/投影字段?

时间:2018-04-08 04:59:58

标签: mongodb mongodb-query

如果我的MongoDB数据库中有一个文档,如:

{"fld1": "value1",
 "fld2": "value2",
 "arr1": [{"arr1fld1": "arrval1", "arr1fld2": "arrval2"},
           "arr1fld1": "arrval3", "arr1fld2": "arrval4"}]
}

等......如果我想要fld1和" arr1fld2"是否可以写一个查找但只有数组的第一个元素?理想情况下,我生成的文档看起来像:

{"fld1": "value1", "arr1fld2": "arrval2"}

我知道我可以使用$ slice来获取第一个数组元素......类似于:

find({}, {"fld1": 1, "arr1": {$slice:1}})

但是这会回来:

{"fld1": "value1", "arr1": [{"arr1fld1": "arrval1", "arr1fld2": "arrval2"}]}

2 个答案:

答案 0 :(得分:1)

使用聚合框架......

您可以通过展开获得投影

然后获取第一个元素

db.fields.aggregate([
   {$project: { 
             fld1: 1,
             "arr1.arr1fld2": 1
       }
    },
    {$unwind : "$arr1" },
    {$group : {
           _id: "$_id",
           fld1: { $first: "$fld1"},
           arr1fld2: { $first: "$arr1.arr1fld2" }
         }
    }
])

答案 1 :(得分:0)

根据上述问题中的描述作为解决方案,请尝试执行以下聚合查询。

db.collection.aggregate(

        // Pipeline
        [
            // Stage 1
            {
                $project: {
                    array1: {
                        $arrayElemAt: ['$arr1', 0]
                    },
                    'fld1': 1
                }
            },

            // Stage 2
            {
                $project: {
                    arr1fld2: '$array1.arr1fld2',
                    fld1: 1,
                    _id: 0
                }
            }

        ]  
);