mongodb 聚合添加从另一个字段派生的字段
mongodb aggregation add field derived from another field
这是我需要添加到集合中的数据
let data = {
'a':'data a',
'ab':'data a',
'b':'data b',
'c':'data c'
}
这是我收集的数据:
{
name:'xyz',
age:'100',
arr: ['a','ab']
}
我想要的:
{
name:'xyz',
age:'100',
arr: ['a','ab'],
data:'data a' //get this from arr first element, and that is key in data object that's value here
}
谁能帮我用猫鼬写这个查询?
您需要使用以下管道阶段和运算符的聚合操作:
$addFields
: 向管道文档添加新字段
$objectToArray
:将 object/document 转换为数组。这对于检查匹配数组元素的索引是必要的
$arrayElemAt
:获取指定数组索引处的元素
$indexOfArray
:获取指定值 第一次出现的数组索引(zero-based)
您的最终管道应如下所示:
let data = {
'a':'data a',
'ab':'data a',
'b':'data b',
'c':'data c'
};
db.collection.aggregate([
{ $addFields: {
data: { $objectToArray: data },
} },
{ $addFields: {
data: {
$arrayElemAt: [
'$data.v',
{
$indexOfArray: [
'$data.k',
{ $first: '$arr' }
]
}
]
}
} }
])
或
db.collection.aggregate([
{ $addFields: {
data: { $objectToArray: data },
} },
{ $addFields: {
data: {
$arrayElemAt: [
'$data.v',
{
$indexOfArray: [
'$data.k',
{ $arrayElemAt: ['$arr', 0] }
]
}
]
}
} }
])
这是我需要添加到集合中的数据
let data = {
'a':'data a',
'ab':'data a',
'b':'data b',
'c':'data c'
}
这是我收集的数据:
{
name:'xyz',
age:'100',
arr: ['a','ab']
}
我想要的:
{
name:'xyz',
age:'100',
arr: ['a','ab'],
data:'data a' //get this from arr first element, and that is key in data object that's value here
}
谁能帮我用猫鼬写这个查询?
您需要使用以下管道阶段和运算符的聚合操作:
$addFields
: 向管道文档添加新字段$objectToArray
:将 object/document 转换为数组。这对于检查匹配数组元素的索引是必要的$arrayElemAt
:获取指定数组索引处的元素$indexOfArray
:获取指定值 第一次出现的数组索引(zero-based)
您的最终管道应如下所示:
let data = {
'a':'data a',
'ab':'data a',
'b':'data b',
'c':'data c'
};
db.collection.aggregate([
{ $addFields: {
data: { $objectToArray: data },
} },
{ $addFields: {
data: {
$arrayElemAt: [
'$data.v',
{
$indexOfArray: [
'$data.k',
{ $first: '$arr' }
]
}
]
}
} }
])
或
db.collection.aggregate([
{ $addFields: {
data: { $objectToArray: data },
} },
{ $addFields: {
data: {
$arrayElemAt: [
'$data.v',
{
$indexOfArray: [
'$data.k',
{ $arrayElemAt: ['$arr', 0] }
]
}
]
}
} }
])