根据匹配条件为 Mongodb 聚合中的每个数组元素添加新字段
Add new field to each array elements in Mongodb aggregation based on match condition
我有以下mongodbcollection
{ "id" : "yzes547",
"courseId" : "aw4a34y7",
"objectives" : [
{
"type" : "LESSON",
"id" : "dfhxytd"
},
{
"type" : "MODULE",
"id" : "rgzeerp"
}
]
}
我想在目标参数中为每种类型的 ID 添加新字段。
期望的输出
{ "id" : "yzes547",
"courseId" : "aw4a34y7",
"objectives" : [
{
"type" : "LESSON",
"id" : "dfhxytd"
},
{
"type" : "MODULE",
"id" : "rgzeerp"
}
]
"lessonId": "dfhxytd",
"moduleId": "rgzeerp"
}
我尝试了以下查询,但它只是 returns 错误。
db.account.aggregate([
{
'$project': {
'_id': 0,
'questionId': 1,
'courseId': 1,
'lessonId': {
'$cond': [
{
'$eq': [
'$objectives.type', 'LESSON'
]
}, '$objectives.id', False
]
},
'moduleId': {
'$cond': [
{
'$eq': [
'$objectives.type', 'MODULE'
]
}, '$objectives.id', False
]
}
是否可以查询数据库,使我们可以通过一种聚合方法获得每种类型的新字段?
是的,您可以很容易地使用 $map
和 $objectToArray
创建所需的字段,最后使用 $replaceRoot
和 $mergeObjects
您可以添加这些字段到原来的结构,像这样:
db.collection.aggregate([
{
$replaceRoot: {
newRoot: {
"$mergeObjects": [
"$$ROOT",
{
"$arrayToObject": {
$map: {
input: "$objectives",
as: "obj",
in: {
k: {
$concat: [
{
"$toLower": "$$obj.type"
},
"Id"
]
},
v: "$$obj.id"
}
}
}
}
]
}
}
}
])
我有以下mongodbcollection
{ "id" : "yzes547",
"courseId" : "aw4a34y7",
"objectives" : [
{
"type" : "LESSON",
"id" : "dfhxytd"
},
{
"type" : "MODULE",
"id" : "rgzeerp"
}
]
}
我想在目标参数中为每种类型的 ID 添加新字段。
期望的输出
{ "id" : "yzes547",
"courseId" : "aw4a34y7",
"objectives" : [
{
"type" : "LESSON",
"id" : "dfhxytd"
},
{
"type" : "MODULE",
"id" : "rgzeerp"
}
]
"lessonId": "dfhxytd",
"moduleId": "rgzeerp"
}
我尝试了以下查询,但它只是 returns 错误。
db.account.aggregate([
{
'$project': {
'_id': 0,
'questionId': 1,
'courseId': 1,
'lessonId': {
'$cond': [
{
'$eq': [
'$objectives.type', 'LESSON'
]
}, '$objectives.id', False
]
},
'moduleId': {
'$cond': [
{
'$eq': [
'$objectives.type', 'MODULE'
]
}, '$objectives.id', False
]
}
是否可以查询数据库,使我们可以通过一种聚合方法获得每种类型的新字段?
是的,您可以很容易地使用 $map
和 $objectToArray
创建所需的字段,最后使用 $replaceRoot
和 $mergeObjects
您可以添加这些字段到原来的结构,像这样:
db.collection.aggregate([
{
$replaceRoot: {
newRoot: {
"$mergeObjects": [
"$$ROOT",
{
"$arrayToObject": {
$map: {
input: "$objectives",
as: "obj",
in: {
k: {
$concat: [
{
"$toLower": "$$obj.type"
},
"Id"
]
},
v: "$$obj.id"
}
}
}
}
]
}
}
}
])