【发布时间】:2020-07-31 07:35:44
【问题描述】:
Mongo DB 4.0
我想通过连接字段来更新文档数组的所有元素 我有以下文件:
{
"id": 123455,
"articles": [
{
"country": "DE",
"articleNumber": "123456789"
},
{
"country": "AT",
"articleNumber": "987654321"
}
]
}
我需要用一个新字段来扩展文章,该字段与其他字段连接
{
"id": 123455,
"articles": [
{
"country": "DE",
"articleNumber": "123456789",
"countryArticleNumber": "DE123456789"
},
{
"country": "AT",
"articleNumber": "987654321",
"countryArticleNumber": "AT987654321"
}
]
}
我尝试了几种在 Stackoverflow 中找到的解决方案,例如:
db.articleDocument.update (
{_id: ObjectId('5f15414ff3812f4838391edd')},
{
$push:
{'articles.countryArticleNumber': 'dasd'}
}
)
但即使我得到了一个简单的更新
MongoWriteException:无法在其中创建字段“countryArticleNumber” 元素{文章:[{
我也尝试使用 db.articleDocument.updateOne,$set 而不是 $push,位置运算符
我期待这样的事情应该可以工作
db.articleDocument.updateOne(
{_id: ObjectId('5f15414ff3812f4838391edd')},
{
$set:
{
"articles.$.countryArticleNumber": {
$concat: ["articles.$.country", "articles.$.articleNumber"]
}
}
}
)
但是
位置运算符没有从查询中找到所需的匹配项。
感谢高级
【问题讨论】:
-
您需要使用Update with Aggregation。聚合使用$map 数组运算符。
-
@prasad_ 您指的是 4.4 版文档。不幸的是,我使用的是 MongoDB 4.0。
-
我的意思是,MongoDB v4.2(聚合更新从 v4.2 开始可用)。您仍然可以使用 same 聚合管道,然后进行更新 - 这将是一个两步操作。
-
现在还有
$addToSet,(我相信也是4.2)可以与更新一起使用,如果它丢失,它将创建数组。 docs.mongodb.com/manual/reference/operator/update/addToSet -
这里有一个类似的帖子,有一个答案:Updating data type to an Object in mongoDB。请注意
$map的用法,您可以在其中使用两个现有字段创建countryArticleNumber。
标签: mongodb