猫鼬过滤后提取第一个子数组元素
Mongoose extract first subarray element after filtering
我在子文档中有这样的数组
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"descDay" : [
{
"language" : "en",
"desc": "day description"
},
{
"language" : "es",
"desc": "descripcion del dia"
}
]
}
我想按语言过滤子文档。我可以这样做
db.test.aggregate([
{ $project: {
descDay: {$filter: {
input: '$list',
as: 'item',
cond: {$gt: ['$$item.language', 'en']}
}}
}}
])
那会给我类似的东西
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"descDay" : [
{
"language" : "en",
"desc": "day description"
}]
}
但我需要 descDay 成为文档而不是数组,如下所示:
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"descDay" :
{
"language" : "en",
"desc": "day description"
}
}
我怎样才能得到它?
您可以使用 $unwind
将单元素 descDay
数组展开为一个对象:
db.test.aggregate([
{ $project: {
descDay: {$filter: {
input: '$descDay',
as: 'item',
cond: {$eq: ['$$item.language', 'en']}
}}
}},
{ $unwind: '$descDay' }
])
或者,正如@chridam 提到的,您可以在 $project
中使用 $arrayElemAt
并直接投影第一个元素:
db.test.aggregate([
{ $project: {descDay: {$arrayElemAt: [
{$filter: {
input: '$descDay',
as: 'item',
cond: {$eq: ['$$item.language', 'en']}
}}, 0]
}}}
])
无论哪种方式,输出都是:
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"descDay" : {
"language" : "en",
"desc" : "day description"
}
}
请注意,我必须解决您原始查询中的几个问题:
'$list'
到 '$descDay'
$gt
到 $eq
我在子文档中有这样的数组
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"descDay" : [
{
"language" : "en",
"desc": "day description"
},
{
"language" : "es",
"desc": "descripcion del dia"
}
]
}
我想按语言过滤子文档。我可以这样做
db.test.aggregate([
{ $project: {
descDay: {$filter: {
input: '$list',
as: 'item',
cond: {$gt: ['$$item.language', 'en']}
}}
}}
])
那会给我类似的东西
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"descDay" : [
{
"language" : "en",
"desc": "day description"
}]
}
但我需要 descDay 成为文档而不是数组,如下所示:
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"descDay" :
{
"language" : "en",
"desc": "day description"
}
}
我怎样才能得到它?
您可以使用 $unwind
将单元素 descDay
数组展开为一个对象:
db.test.aggregate([
{ $project: {
descDay: {$filter: {
input: '$descDay',
as: 'item',
cond: {$eq: ['$$item.language', 'en']}
}}
}},
{ $unwind: '$descDay' }
])
或者,正如@chridam 提到的,您可以在 $project
中使用 $arrayElemAt
并直接投影第一个元素:
db.test.aggregate([
{ $project: {descDay: {$arrayElemAt: [
{$filter: {
input: '$descDay',
as: 'item',
cond: {$eq: ['$$item.language', 'en']}
}}, 0]
}}}
])
无论哪种方式,输出都是:
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"descDay" : {
"language" : "en",
"desc" : "day description"
}
}
请注意,我必须解决您原始查询中的几个问题:
'$list'
到'$descDay'
$gt
到$eq