如何更新 MongoDB 中嵌套数组元素的特定 属性
How do I update a specific property of a nested array element in MongoDB
我有一个具有以下结构的集合:
{
arrangements: [
{ displayName: "MRT.8" },
{ displayName: "MRT.10" },
{ displayName: "MRT.12" },
(...)
]
}
我要把子串MRT
替换成MOBILE
,所以结果会是这样:
{
arrangements: [
{ displayName: "MOBILE.8" },
{ displayName: "MOBILE.10" },
{ displayName: "MOBILE.12" },
(...)
]
}
在 the solution for a a similar problem on SO 之后我做了以下事情:
db.collection('releaseDocument').updateMany({"arrangements.displayName": {$regex: /MRT\..*/}}, [
{
$set: {
'arrangements.displayName': {
$concat: [
"MOBILE.",
{$arrayElemAt: [{$split: ["$displayName", "MRT."]}, 0]}
]
}
}
}
])
但这不起作用,因为 $
指的是当前文档,而不是嵌套的数组元素。我怎样才能实现我上面描述的目标?
您似乎正在使用带有聚合管道的更新,您需要 $map
运算符。
对于 $arrayElementAt
部分,我认为您需要 1 作为索引来获取第二个元素。
假设要更新的过滤器returns个文档:
db.collection.update({
"arrangements.displayName": {
$regex: /MRT\..*/
}
},
[
{
$set: {
"arrangements": {
$map: {
input: "$arrangements",
in: {
$mergeObjects: [
"$$this",
{
displayName: {
$concat: [
"MOBILE.",
{
$arrayElemAt: [
{
$split: [
"$$this.displayName",
"MRT."
]
},
1
]
}
]
}
}
]
}
}
}
}
}
])
我有一个具有以下结构的集合:
{
arrangements: [
{ displayName: "MRT.8" },
{ displayName: "MRT.10" },
{ displayName: "MRT.12" },
(...)
]
}
我要把子串MRT
替换成MOBILE
,所以结果会是这样:
{
arrangements: [
{ displayName: "MOBILE.8" },
{ displayName: "MOBILE.10" },
{ displayName: "MOBILE.12" },
(...)
]
}
在 the solution for a a similar problem on SO 之后我做了以下事情:
db.collection('releaseDocument').updateMany({"arrangements.displayName": {$regex: /MRT\..*/}}, [
{
$set: {
'arrangements.displayName': {
$concat: [
"MOBILE.",
{$arrayElemAt: [{$split: ["$displayName", "MRT."]}, 0]}
]
}
}
}
])
但这不起作用,因为 $
指的是当前文档,而不是嵌套的数组元素。我怎样才能实现我上面描述的目标?
您似乎正在使用带有聚合管道的更新,您需要 $map
运算符。
对于 $arrayElementAt
部分,我认为您需要 1 作为索引来获取第二个元素。
假设要更新的过滤器returns个文档:
db.collection.update({
"arrangements.displayName": {
$regex: /MRT\..*/
}
},
[
{
$set: {
"arrangements": {
$map: {
input: "$arrangements",
in: {
$mergeObjects: [
"$$this",
{
displayName: {
$concat: [
"MOBILE.",
{
$arrayElemAt: [
{
$split: [
"$$this.displayName",
"MRT."
]
},
1
]
}
]
}
}
]
}
}
}
}
}
])