Каждый массив строк, каждая из которых выгружается и увеличивается до 1, но сохраняет 2 в указанном поле c - PullRequest
0 голосов
/ 14 июля 2020

Добрый день,

Я создаю api, используя node.js, express. js, и данные сохраняются в 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)

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

Когда тег по полю имени уже существует, я просто обновлю общность этого существующего приращения тега до 1 шага. В противном случае я вставлю новый документ тега с общностью 1.

Что-то не так с зацикливанием? Потому что без al oop и только одного тега он работает хорошо. Или зацикливание ожидаемого сохранения - не лучшая идея? Ваша помощь очень ценится. Берегите всех.

1 Ответ

2 голосов
/ 14 июля 2020

Хорошо, проблема в том массиве. Вам нужно использовать positional operator $. В противном случае все элементы в массиве будут обновляться каждый раз.

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

Вы должны сделать что-то, как указано выше.

Введите do c:

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

Он обновит соответствующий commonality

Как и в коде - согласно предложению OP - добавив это

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