我有一個簡單的集合,其中包含這樣的檔案:
{
_id: ObjectId('62b196e43581370007773393'),
name: 'John',
jobs: [
{
company: 'ACME',
type: 'programmer',
technologies: [
{
level: 1,
name: 'Java'
},
{
level: 3,
name: 'MongoDB'
}
]
}
]
}
我想將所有技術收集到“程式員”作業的“作業”子檔案中的一個新領域,以實作此效果:
(...)
jobs: [
{
it_technologies : ["Java", "MongoDB"]
(...)
}
]
(...)
問題是我不知道如何使用此查詢參考和收集檔案的正確元素:
db.runCommand({update: "employees",
updates: [
{
q: {},
u: { $set: { "jobs.$[j].it_technologies": "<how to collect all technologies in this job?>" } },
upsert: false,
multi: true,
arrayFilters: [{
$and:
[
{"j.type": "programmer"},
{"j.technologies": {$exists : true, $ne: []} }
]
}]
}
] });
有可能嗎?我會很感激任何線索!
uj5u.com熱心網友回復:
認為您需要使用聚合管道進行更新。
map
- 迭代jobs
陣列并回傳一個新陣列。1.1。
$cond
- 檢查條件(匹配當前檔案jobs
type
并且technology
不是空陣列)。如果滿足,則更新檔案,否則保持存在。1.1.1。
$mergeObjects
- 將當前檔案與帶有it_technologies
.
db.collection.update({},
[
{
$set: {
"jobs": {
$map: {
input: "$jobs",
in: {
$cond: {
if: {
$and: [
{
$eq: [
"$$this.type",
"programmer"
]
},
{
$ne: [
"$$this.technologies",
[]
]
}
]
},
then: {
$mergeObjects: [
"$$this",
{
it_technologies: "$$this.technologies.name"
}
]
},
else: "$$this"
}
}
}
}
}
}
],
{
upsert: false,
multi: true,
})
示例 Mongo Playground
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/494689.html
標籤:mongodb mongodb查询 mongodb-更新
上一篇:MongodbAggregator-檢查字串是否包含數字或特殊字符
下一篇:在陣列中查找包含特定值的檔案