猫鼬 - 重命名数组中的对象键
Mongoose - renaming object key within array
我有这个模式
{
_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 }] } } )
但它似乎正在删除“库存”字段本身
这里的第一件事是尝试使用 $rename 但是文档是如何解释的:
$rename
does not work if these fields are in array elements.
所以需要另寻他法。因此,您可以将此更新与聚合查询一起使用:
此查询主要使用$map
、$arrayToObject
和$objectToArray
。这里的技巧是:
- 创建一个名为
inventory
的新字段(覆盖现有字段)
- 使用
$map
遍历数组的每个值,然后为数组中的每个对象使用 $objectToArray
创建一个数组,并再次使用 [=12= 遍历第二个数组].
- 在第二次迭代中创建字段
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"
}
}
}
}
}
}
}
}
])
示例here
我有这个模式
{
_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 }] } } )
但它似乎正在删除“库存”字段本身
这里的第一件事是尝试使用 $rename 但是文档是如何解释的:
$rename
does not work if these fields are in array elements.
所以需要另寻他法。因此,您可以将此更新与聚合查询一起使用:
此查询主要使用$map
、$arrayToObject
和$objectToArray
。这里的技巧是:
- 创建一个名为
inventory
的新字段(覆盖现有字段) - 使用
$map
遍历数组的每个值,然后为数组中的每个对象使用$objectToArray
创建一个数组,并再次使用 [=12= 遍历第二个数组]. - 在第二次迭代中创建字段
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"
}
}
}
}
}
}
}
}
])
示例here