繁体   English   中英

Mongo function updateOne 不更新它应该更新的字段

[英]Mongo function updateOne doesn't update the field it's suppose to update

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

前提:我在 http 请求中得到一个 id 字段(不是 _id)。 id 的格式为<name>-stage-### 我想在没有-stage-###部分的情况下将 id 的值更改为相同的值。
所以我现在有 2 个字符串:包含“阶段”部分的 issueId 和不包含的 bareIssue。
我删除而不检查 id = bareIssue 的记录(如果存在,则将其删除,这部分工作正常)。
然后我尝试使用id=issueId更新记录的 id 字段,并将其更改为 bareIssue。 这不起作用。

其他不起作用的事情:

  • "id"或 id 字段周围添加或删除引号不会改变任何内容

  • 将 $eq 修饰符放在查询短语中不会改变任何内容

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

  • 将 function 添加到 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")
    }
});

我希望文档会更新。 它不是。

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

试试这个 -

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")
    }
});

感谢所有试图提供帮助的人。 我的问题是这样的:我的模式不包括项目“id”,它以严格模式运行。 显然,在 Robo 3T 中,架构是由其他人更新的,但不是在代码中。 愚蠢的错误,花了我一整天的时间来弄清楚和修复。 不要让它发生在你身上:)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM