日安,
我使用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。
循环有什么问题吗? 因为没有循环和只有一个标记,它工作得很好。 或者循环等待的扑救不是个好主意? 非常感谢你的帮助。 保证大家的安全。
问题是那个数组。 您需要使用位置运算符$
。 否则,每次数组中的所有元素都将被更新。
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