我的 mongodb 集合中有以下一組資料,稱為 orders:
{
"_id" : ObjectId("618e0e1b17687316dcdd6246"),
"groupUID": "abc",
"orderData" : {
"charges" : {
"total" : 18480.0,
"subtotal" : 13980.0
},
"items" : [
{
"name" : "Chocolate cookies",
"imageURL": "domainURL2.com/cookies"
},
{
"name" : "Chocolate muffins",
"imageURL": "domainURL2.com/muffins"
}
]
}
}
現在我想在這個集合的每個檔案中將“domainURL2”的 imageURL 子字串部分更新為“domainURL1”欄位。到目前為止,我有以下查詢:
db.orders.update( { "groupUID" : "abc" }, { "$set": { "orderData.items.$.imageURL":"myURL.com" } } )
我也有 javascript 形式的查詢,但我希望這是純 mongo 查詢。所以不幸的是,下面的查詢不會為我做。
db.getCollection("orders").find({"groupUID" : "abc"}).forEach(function(aRow) {
if (aRow.orderDetails !== undefined) {
var updated = false;
aRow.orderData.items.forEach(function(item) {
item.imageURL = item.imageURL.replace("eddress/", "noknok-app/");
})
db.getCollection("orders").save(aRow);
}
});
我想更新所有記錄的 imageURL 欄位的子字串部分。我無法弄清楚查詢的其余部分。誰能幫幫我嗎。
uj5u.com熱心網友回復:
我的回答可能看起來很復雜(歡迎提出建議/改進)。
使用聚合管道進行更新。
$set- 更新orderData.items欄位。1.1。
$map- 迭代orderData.items并回傳新陣列。1.1.1。- 從1.1.1.1
$mergeObjects合并當前物件和imageURL欄位。1.1.1.1。
$cond-用“domainURL2.com”$regexMatch查找imageURL開頭。1.1.1.2。如果為真,則將“domainURL2.com”替換為“domainURL1.com”。
1.1.1.3。如果為 false,則保留現有值。
db.collection.update({
"groupUID": "abc"
},
[
{
"$set": {
"orderData.items": {
$map: {
input: "$orderData.items",
in: {
$mergeObjects: [
"$$this",
{
imageURL: {
$cond: {
if: {
$regexMatch: {
input: "$$this.imageURL",
regex: "^domainURL2.com"
}
},
then: {
$concat: [
"domainURL1.com",
{
$arrayElemAt: [
{
$split: [
"$$this.imageURL",
"domainURL2.com"
]
},
-1
]
}
]
},
else: "$$this.imageURL"
}
}
}
]
}
}
}
}
}
])
示例 Mongo Playground
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/477729.html
上一篇:如何搜索mongodb
