【问题标题】:Creating a field in an a object if it doesn't exist, incrementing it if it does if it does, for multiple objects?如果一个对象不存在,则在对象中创建一个字段,如果存在,则将其递增,对于多个对象?
【发布时间】:2022-11-19 22:51:06
【问题描述】:

我有一个集合“用户”

{
  "id": "u101",
  "notifications": {}
},


{
  "id": "u102",
  "notifications": {"channelId": 1}
},

有一个包含对象的通知字段。该对象的每个字段都对应一个聊天频道 ID,它们的值是频道中的通知数量(未读消息)。

如果用户“u101”“u102”都在同一个频道并且他们收到通知,我需要创建一个“频道号”用户字段“u101”并将值设置为1个.我还需要更新用户“u102”的值并设置值“频道号”2个

预期结果如下:

{
  "id": "u101",
  "notifications": {"channelId": 1}
},


{
  "id": "u102",
  "notifications": {"channelId": 2}
},

我试过通过简单地查询“用户”集合来做到这一点,让用户返回数组,然后使用 ES6 函数循环它,如下所示:

users.forEach(user => {
            user.notifications.hasOwnProperty(channelId) ?
                user.notifications[channelId]++
                :
                user.notifications[channelId] = 1
        })

它运作良好,但问题是我需要循环更新所有用户

collection.updateOne({ '_id': user._id }, { $set: user })

它可以在一个频道中吸引大量用户。有没有一种方法可以通过一个 MongoDB 命令来实现?

【问题讨论】:

  • 我认为您在这里寻找的主要内容是用于更新查询部分的 $in 运算符

标签: javascript mongodb


【解决方案1】:

您可以使用 $inc 来增加或创建单个查询中所有需要的文档的值(如果不存在):

db.collection.update(
  {},
  {$inc: {"notifications.channelId": 1}},
  {multi: true}
)

查看它在playground example 上的工作原理

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 2019-09-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多