Node.js 对于每个字符串数组,每个字符串都是upsert并递增为1,但在特定字段上保存2
你好 我使用node.js、express.js构建api,数据保存到mongodb 我的路线是Node.js 对于每个字符串数组,每个字符串都是upsert并递增为1,但在特定字段上保存2,node.js,mongodb,express,Node.js,Mongodb,Express,你好 我使用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 = {
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']
但是保存(共性:2)奇怪的事情发生在这里
//document 1
{
"name" : "blood",
"commonality" : 2
}
//document 2
{
"name" : "test",
"commonality" : 2
}
而不是(共性:1)
当标签按名称字段已存在时,我将只将现有标签的通用性增量更新为1步。否则,我将插入通用性为1的tag新文档
循环有什么问题吗?因为没有循环,只有一个标记,它工作得很好。或者循环等待的储蓄不是个好主意?非常感谢你的帮助。确保每个人的安全。好的,问题在于阵列。您需要使用
位置运算符$
。否则,数组中的所有元素每次都将更新
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
好的,问题是这个数组。您需要使用
位置运算符$
。否则,数组中的所有元素每次都将更新
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
您是否也将标记作为数组,并且这些对象也位于同一文档中?或者你想为每个标记插入公共性?嗨@Gibbs,是的,我提供了一个上面显示的示例数组og标记,它们在req.body内的同一个文档中。当不存在时,我尝试保存一个值为1的项目,否则插入并将公共性增加到1步。血液和测试是数组的一部分。这是一个对象数组吗?它们是字符串数组@gibbs你有标签作为数组吗?这些对象也在同一个文档中吗?或者你想为每个标记插入公共性?嗨@Gibbs,是的,我提供了一个上面显示的示例数组og标记,它们在req.body内的同一个文档中。当不存在时,我尝试保存一个值为1的项目,否则插入并将公共性增加到1步。血液和测试是数组的一部分。这是对象数组吗?它们是字符串数组@gibbusing位置运算符,非常感谢。我忘了,从没想过。你能用这个更新你的答案吗?const update={$inc:{[
${tag}.$.commonity
]:1}然后我会接受你的回答。@AljohnYamaro我不是JS专家。我加了一句我的意思。很高兴,这有助于定位运算符的工作,非常感谢。我忘了,从没想过。你能用这个更新你的答案吗?const update={$inc:{[${tag}.$.commonity
]:1}然后我会接受你的回答。@AljohnYamaro我不是JS专家。我加了一句我的意思。很高兴,它起了作用