我有這個模式
{
_id: "123456",
id: "123",
inventory: [
{
id: "foo",
count: 0
},
{
id: "bar",
count: 3
}
]
}
我希望庫存陣列中的每個“計數”鍵都是“價格”,最后看起來像這樣:
{
_id: "123456",
id: "123",
inventory: [
{
id: "foo",
price: 0
},
{
id: "bar",
price: 3
}
]
}
我試過這個
Model.updateOne({ id: "123" }, { $unset: { inventory: [{ count: 1 }] } } )
但它似乎正在洗掉“庫存”欄位本身
uj5u.com熱心網友回復:
這里的第一件事是嘗試使用$rename但檔案如何解釋:
$rename如果這些欄位在陣列元素中,則不起作用。
所以有必要尋找另一種方法。因此,您可以將此更新與聚合查詢一起使用:
此查詢主要使用$map,$arrayToObject和$objectToArray。這里的訣竅是:
- 創建一個名為
inventory(覆寫現有欄位)的新欄位 - 使用 迭代陣列的每個值
$map,然后為陣列中的每個物件$objectToArray創建一個陣列,并再次使用 迭代第二個陣列$map。 - 在第二次迭代中創建欄位
k和v. 欄位v將是相同的(您不想更改值,只更改鍵)。對于欄位k,您只需更改與您的條件匹配的欄位,即僅從更改count為price。如果此條件不匹配,則保留密鑰。
db.collection.update({},
[
{
$set: {
inventory: {
$map: {
input: "$inventory",
in: {
$arrayToObject: {
$map: {
input: {$objectToArray: "$$this"},
in: {
k: {
$cond: [
{
$eq: ["$$this.k","count"]
},
"price",
"$$this.k"
]
},
v: "$$this.v"
}
}
}
}
}
}
}
}
])
這里的例子
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/443296.html
標籤:javascript 节点.js 猫鼬
