如果我的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"}]}
答案 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
}
}
]
);