Mongo函数updateOne不会更新应该更新的字段

时间:2019-09-19 09:12:02

标签: javascript mongodb mongoose

我在服务器上的PUT请求中运行了updateOne函数,尽管该函数没有返回错误,但显然找不到该记录。更新不会发生。

前提:我在http请求中收到一个id字段(不是_id)。 ID的格式为<name>-stage-###。我想将id的值更改为不带-stage-###部分的值。
因此,我现在有2个字符串:issueId包括“ stage”部分,而bowIssue不包括。
我删除了ID而没有检查的记录,即id = nudeIssue(如果存在,则将其删除,并且这部分工作正常)。
然后,我尝试使用id=issueId更新记录的id字段,并将其更改为nudeIssue。这是行不通的。

其他无效的东西:

  • "id"或id字段周围添加或删除引号不会发生任何变化

  • 将$ eq修饰符放在查询词组中不会发生任何变化

  • 将我要搜索的ID更改为不存在的ID不会有任何改变,换句话说,如果我尝试updateOne({id:"BLABLABLAFOOBAR"}, {$set: {id:"NiceID"}}) ,. then子句仍然会成功的更新。

  • 向updateOne添加函数并检查错误永远不会出错。

  • 尝试使用mongo ID代替字符串,因为id无效。

const dbConnection = mongoose.createConnection(DbServerLocation, options);
const db = dbConnection.useDb('issuesAndFiles');
const issuesModel = db.model(ISSUES_COLLECTION_NAME, reportSchema, ISSUES_COLLECTION_NAME);  // In short - it is a model


router.put('/', (req, res, next) => {
    let issueId = req.query['id'];
    if (issueId) {
        let bareIssue = issueId.substring(0, issueId.indexOf("-stage-"));
        issuesModel.findOneAndRemove({id:bareIssue}).then(() => {
            const query = {$eq: {id:issueId}};
            const subst = {$set :{id:bareIssue}};
            let retval = issuesModel.updateOne(query, subst)
                .then(() => {
                    console.log("Put: success in updateOne");
                    res.status(200).send("Approved")
                }
                )
        })
    }
    else {
        res.status(404).send("Issue not specified")
    }
});

我希望文档得到更新。不是。

3 个答案:

答案 0 :(得分:0)

$ eq语法错误。尝试{ <field>: { $eq: <value> } }

答案 1 :(得分:0)

尝试一下-

const dbConnection = mongoose.createConnection(DbServerLocation, options);
const db = dbConnection.useDb('issuesAndFiles');
const issuesModel = db.model(ISSUES_COLLECTION_NAME, reportSchema, ISSUES_COLLECTION_NAME);  // In short - it is a model


router.put('/', (req, res, next) => {
    let issueId = req.query['id'];
    if (issueId) {
        let bareIssue = issueId.substring(0, issueId.indexOf("-stage-"));
        issuesModel.findOneAndRemove({id:bareIssue}).then(() => {
            /* const query = {$eq: {id:issueId}};
            const subst = {$set :{id:bareIssue}}; */

            const query = {id : {$eq: issueId}};
            const subst = {$set :{id:bareIssue}};

            let retval = issuesModel.updateOne(query, subst)
                .then(() => {
                    console.log("Put: success in updateOne");
                    res.status(200).send("Approved")
                }
                )
        })
    }
    else {
        res.status(404).send("Issue not specified")
    }
});

答案 2 :(得分:0)

感谢所有尝试提供帮助的人。 我的问题是这样的:我的架构不包含项目“ id”,并且它以严格模式运行。显然,在Robo 3T中,架构是由其他人更新的,但未在代码中进行更新。愚蠢的错误使我整日不得不思考并解决。不要让它发生在您身上:)

注意寻找答案的人:如果您有模型的变量,例如: const issuesModel = db.model(ISSUES_COLLECTION_NAME, issueSchema, ISSUES_COLLECTION_NAME);确保issueSchema项包含您要更改的名称。