Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 对于每个字符串数组,每个字符串都是upsert并递增为1,但在特定字段上保存2_Node.js_Mongodb_Express - Fatal编程技术网

Node.js 对于每个字符串数组,每个字符串都是upsert并递增为1,但在特定字段上保存2

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 = {

你好

我使用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']
但是保存(共性: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专家。我加了一句我的意思。很高兴,它起了作用