使用mongo查询从一个对象数组到另一个对象数组的值



我有如下所述的文档。使用mongodb updateOne查询

将valueArray中的第一个对象的值字段设置为评论数组中的最后一个值
[
{
_id: 1,
user: "abc",
status: false,
valueArray: [
{
value: 15,
isValid: true
},
{
value: 75,
isValid: false
},
{
value: 12,
isValid: false
}
],
comments: [
{
value: "hello"
},
{
value: "world"
},
{
value: "from"
}
]
}
]

希望使用mongodb updateOne查询将valueArray中的第一个对象的值字段设置为评论数组中的最后一个值

如果注释数组为空,则将值设置为空字符串

我正在尝试的查询是:

db.collection.update({
"_id": 1
},
{
"$set": {
"valueArray.0.value": {
$arrayElemAt: [
"$comments.value",
-1
]
}
}
})

预期输出

[
{
"_id": 1,
"comments": [
{
"value": "hello"
},
{
"value": "world"
},
{
"value": "from"
}
],
"status": false,
"user": "abc",
"valueArray": [
{
"isValid": true,
"value": "from"
},
{
"isValid": false,
"value": 75
},
{
"isValid": false,
"value": 12
}
]
}
]

您可以使用$reduce来遍历数组,并根据您的条件向累加器添加元素。

db.collection.update({},
[
{
"$addFields": {
"valueArray": {
"$reduce": {
"input": "$valueArray",
"initialValue": [],
"in": {
"$cond": {
// first element, so accumulator is still []
"if": {
$eq: [
[],
"$$value"
]
},
"then": [
// perform your logic
{
value: {
"$arrayElemAt": [
"$comments.value",
-1
]
},
isValid: "$$this.isValid"
}
],
"else": {
// simply append to accumulator for remaining array entries
"$concatArrays": [
"$$value",
[
"$$this"
]
]
}
}
}
}
}
}
}
],
{
multi: true
})

Mongo操场

最新更新