提问者:小点点

Foreach字符串数组,每个字符串向上插入并递增到1,但在特定字段上保存2


日安,

我使用node.js,express.js构建api,数据保存到MongoDB。

我的路线里面是

const { Tag } = require('../models/tag')

router.patch('/', async (req, res) => {
  const { tags } = req.body

  tags.forEach(async tag => {
    const filter = { name: tag }
    const option = { upsert: true }

    const update = { $inc: { commonality: 1 } }
    await Tag.findOneAndUpdate(filter, update, option)
  });

  return res.json({})
})

示例

tags = [ 'blood', 'test']

但是这里发生了奇怪的事情。

    //document 1
    {
        "name" : "blood",
        "commonality" : 2
    }
    //document 2
    {
        "name" : "test",
        "commonality" : 2
    }

代替(通用性:1)

    //document 1
    {
        "name" : "blood",
        "commonality" : 1
    }
    //document 2
    {
        "name" : "test",
        "commonality" : 1
    }

当tag by name字段已经存在时,我只会将现有标记的通用性增量更新为1步。 否则,我将插入新文档,标记的通用性为1。

循环有什么问题吗? 因为没有循环和只有一个标记,它工作得很好。 或者循环等待的扑救不是个好主意? 非常感谢你的帮助。 保证大家的安全。


共1个答案

匿名用户

问题是那个数组。 您需要使用位置运算符$。 否则,每次数组中的所有元素都将被更新。

db.test.findOneAndUpdate({
  "tagData.name": "blood"
},{
    $inc: {"tagData.$.commonality":1}
})

你应该做上面的事。

输入单据:

/* 1 */
{
    "_id" : ObjectId("5f0db1229e001b53e3995fde"),
    "tagData" : [ 
        {
            "name" : "blood",
            "commonality" : 2.0
        }, 
        {
            "name" : "test",
            "commonality" : 1
        }
    ]
}

它将更新相应的公共

如代码中所示-根据OP建议-添加以下内容

const update = { $inc: { [${tag}.$.commonality]: 1 } } 
//Specifying positional operator in the update part