$ inc로 두 번 실행되는 MongoDB의 UpdateMany

Aug 21 2020

이전 질문에서받은 도움 ( 문서의 값이있는 UpdateMany mongodb 문서) 덕분에 updateMany를 사용하여 증분하는 방법을 배웠습니다. 다음 코드를 작성했습니다.

ageAllCameraPriorities = async (req, res) => {
    await Camera.updateMany({ enabled: true }, { $inc: { processingPriority: 1 } }, (err, dbResp) => {
        if (err) {
            return res.status(400).json({ success: false, error: "Status 400, unable to age camera priorities" + err })
        }
        if (!dbResp.n) {
            return res
                .status(404)
                .json({ success: false, error: `No enabled cameras found to age` })
        }
        return res.status(200).json({ success: true, data: dbResp })
    })

        .catch(err => console.log(err))
}

이 코드의 의도는 다음과 같은 mongoDB 데이터베이스를 실행하는 것입니다.

[{
    _id: 'ad07f',
    enabled: true,
    priority: 1,
    more: "more data"
},{
    _id: '9da0f',
    enabled: false,
    priority: 6,
    more: "more data"
},{
    _id: '35fas',
    enabled: true,
    priority: 3,
    more: "more data"
},{
    _id: '5f3ax',
    enabled: true,
    priority: 11,
    more: "more data"
}]

... 활성화 된 각 문서의 "priority"필드를 1 씩 늘립니다.

그러나 위의 코드는 값을 2만큼 증가시킵니다.

또한 $inc: { priority: 3 }값을 변경하면 6 씩 증가합니다. 무언가가 두 번 실행되는 것 같습니다. 그러나 나는 우편 배달부로 직접 끝점을 치고 있으며 위의 코드는 내 기능의 전체입니다. 두 번째 증분은 어디에서 오는가?

편집 :
두 번째 실행이이 줄에서 일어나고 있음이 분명합니다. return res.status(200).json({ success: true, data: dbResp })그 줄이 아닌 다른 모든 것을 끌어낼 수 있고 2 씩 증가 할 것이기 때문에 해당 줄을 제거하면 1만큼만 증가하지만 API 끝점은 반환하지 않습니다. 아무것도 ... 그래서 좋지 않습니다)

답변

lowcrawler Aug 22 2020 at 03:25

원래 질문에 대한 의견에 따라 .catch및 을 제거하여이 문제를 해결할 수있었습니다 await.

ageAllCameraPriorities = async (req, res) => {
    Camera.updateMany(  { enabled: true },
        { $inc: { processingPriority: req.params.amount } },
        {},
        (err, dbResp) => {
        if (err) {
            return res
                .status(400)
                .json({ success: false, error: "Status 400, unable to age camera priorities" + err })
        }
        if (!dbResp.n) {
            return res
                .status(404)
                .json({ success: false, error:'No enabled cameras found to age' })
        }
            return res
                .status(200)
                .json({ success: true, data: dbResp })
    })
}
raga Aug 22 2020 at 11:13

이것이 더 나은지 알고 싶었습니다.

ageAllCameraPriorities = async (req, res) => {
    await Camera.updateMany(
         { enabled: true },
         { $inc: { processingPriority: 1 } }
     ).then((dbResp) => {
        if (!dbResp.n) {
            return res
                .status(404)
                .json({ success: false, error: `No enabled cameras found to age` })
        }
        return res.status(200).json({ success: true, data: dbResp })
    }).catch(err => 
       console.log(err);
       return res.status(400).json({ success: false, error: "Status 400, unable to age camera priorities" + err });)
}