【问题标题】:how to use $addToSet and $inc value of the set item in MongoDB如何在 MongoDB 中使用 set 项的 $addToSet 和 $inc 值
【发布时间】:2022-01-21 02:46:35
【问题描述】:

我有一个带有嵌入数组的文档集合:

 {
   name: 'doc1',
   events: []
 },
 {
   name: 'doc1',
   events: [{eventName: 'e1', times: 10}, {eventName: 'e2', times: 1}]
 }

如何将事件添加到嵌入式数组并增加“时间”值?我不想在事件数组中有重复的事件名称。


更新: 我更改了模型以使查询更简单。而不是

 events: [{eventName: 'e1', times: 10}, {eventName: 'e2', times: 1}]

型号是:

events: { e1: 10, e2: 1}

现在使用简单的查询更新文档要容易得多。 但仍然很好奇是否有人在不更改数据模型的情况下提出了一个简单易读的查询。

 .events.updateOne({name: 'doc1'}, { $inc: {events.e1: 1}});

【问题讨论】:

  • 增加所有times 值?
  • 假设 doc1 有一个新事件 'e2' 然后我期望并更新该结果 -> { name: 'doc1', events: [{eventName: 'e1', times: 10}, {事件名称:'e2',次数:2}] }
  • $addToSet 的问题是,元素是{eventName: 'e2', times: 1} 而不是{eventName: 'e2'},这使得(我认为)不可能使用简单的$addToSet

标签: mongodb mongoose mongodb-query


【解决方案1】:

试试这个:

var newEvent = "e2"
db.collection.aggregate([
   {
      $set: {
         events: {
            $cond: {
               if: { $in: [newEvent, "$events.eventName"] },
               then: {
                  $map: {
                     input: "$events",
                     as: "event",
                     in: { $mergeObjects: ["$$event", { times: { $add: ["$$event.times", 1] } }] }
                  }
               },
               else: { $concatArrays: ["$events", [{ eventName: newEvent, "times": 0 }]] },
            }
         }
      }
   }
])

【讨论】:

  • 谢谢,它有效,但有没有更好的方法?我更改了模型以使其更简单,我已经更新了问题。用户聚合框架真的有必要吗?
  • 现在您创建了一个全新的问题,这会使任何现有答案无效,请不要这样做。为更改的数据模型打开一个新问题。是的,我认为你不能避免聚合框架,更新的更加复杂,当然需要聚合。
  • 问题还是一样,update是我让查询更简单的解决方法,不,它不需要聚合框架,我用示例查询更新了
  • 是的,使用{ $inc: {events.times: 1}} 递增events.times。但是,它会更新 每个 元素,并且完全忽略了您的要求“我不想在事件数组中有重复的事件名称”。具有动态字段名称的“简化”数据模型要复杂得多(除非事件已修复),并且在没有聚合管道的情况下无法完成。
  • 对不起,我错过了 e1,更新了查询
猜你喜欢
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2020-08-16
  • 2022-12-03
  • 1970-01-01
  • 2013-07-19
相关资源
最近更新 更多