使用同一文档中的字段减少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:如何为集合中的每个文档设置一个等于另一个字段值的新字段[重复]

如何匹配 MongoDB 中的子文档数组?

如何匹配MongoDB中的子文档数组?

使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段

使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段

使用 Spring Data MongodB 更新嵌入式 mongodb 文档中的数组字段?