使用同一文档中的字段减少mongodb中的字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用同一文档中的字段减少mongodb中的字段相关的知识,希望对你有一定的参考价值。
我有一个商店产品的集合,其中每个文档都是与商店及其位置相关联的产品,以及该商店的该产品的数量。文档架构如下所示:
样本文档:
{
product : 'Mobile Phone',
store : 'Electronics Store',
total_quantity : 5,
locations : [ { id: 'loc1', quantity: 3 }, { id: 'loc2', quantity: 2 } ]
}
我希望能够通过位置ID从所有商店产品中删除一个位置,同时还要更新总数。
我知道我可以通过获取每个文档并对其进行更新来做到这一点,但这需要的查询数量等于具有该位置的产品数量。因此,我正在考虑尝试通过执行两个查询来实现这一目标:
- 一个更新查询将匹配位置ID,并基于它一次减少总数量
- 一个从位置数组中提取位置的删除查询
这里的问题是我不知道如何实现第一步,或者甚至不可能。任何其他建议都值得欢迎。
由于您可以从MongoDB版本> = update-with-an-aggregation-pipeline开始的.update()
操作中执行4.2
,请尝试以下查询:
查询1:该查询通过从现有total_quantity
中减去要删除的特定元素的locations.quantity
来重新创建total_quantity
字段。还重新创建locations
数组,而没有需要删除的元素。
db.collection.updateMany({'locations.id': 'loc1'},
[
{ $addFields: { total_quantity: { $subtract: [ "$total_quantity", { $arrayElemAt: [ "$locations.quantity", { $indexOfArray: [ "$locations.id", "loc1" ] } ] } ] } } },
{ $addFields: { locations: { $filter: { input: "$locations", cond: { $ne: [ "$$this.id", "loc1" ] } } } } }
]
)
Test:在此处测试聚合管道:mongoplayground
查询2:
此查询首先重新创建不需删除元素的locations
数组,然后遍历剩余数组locations.quantity
以求和quantity
数组中所有元素的所有locations
值,以创建[C0 ]字段。
total_quantity
Test:在此处测试聚合管道:db.collection.updateMany({'locations.id': 'loc1'},
[
{ $addFields: { locations: { $filter: { input: "$locations", cond: { $ne: [ "$$this.id", "loc1" ] } } } } },
{ $addFields: { total_quantity: { $reduce: { input: "$locations.quantity", initialValue: 0, in: { $add: [ "$$value", "$$this" ] } } } } }
]
)
注意:如果发现使用mongoplayground执行这些查询时遇到任何问题,请尝试使用带有选项.updateMany()
的.update()
。
以上是关于使用同一文档中的字段减少mongodb中的字段的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB:如何为集合中的每个文档设置一个等于另一个字段值的新字段[重复]
使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段