【问题标题】:Mongo function updateOne doesn't update the field it's suppose to updateMongo 函数 updateOne 不会更新它应该更新的字段
【发布时间】:2019-09-20 00:28:59
【问题描述】:

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

前提:我在 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 子句中获得成功.

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

我预计文档会更新。不是。

【问题讨论】:

  • const query = {id: issueId}; 不工作?
  • 不,它不起作用。我不知道为什么。这可能是一些愚蠢的事情,比如 .then 子句没有按时执行或类似的事情,因为据我所知,它应该起作用。

标签: javascript mongodb mongoose


【解决方案1】:

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

【讨论】:

  • 不起作用。也尝试了简单的 {:} 并且没有工作。
  • 谁能告诉我如何解析从 updateOne 调用中获得的返回值?
  • 在then()之后捕捉到错误,你可能就知道错误了
  • 我在 updateOne 上没有收到错误。当我抓住它时,它不会发生。 updateOne 似乎成功了,只是它没有更改文档。
  • 更多信息:当我在 Robo 3T 上运行以下查询时,它会成功。它只是来自 JavaScript 代码,它(显然)不起作用:db.getCollection('knownIssues').updateOne({id:"SHMN_12347-stage-001"}, {$set: {id: "SHMN_12347"}})
【解决方案2】:

试试这个 -

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

【讨论】:

  • 改了还是不行。还有其他想法吗?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-16
    • 2020-08-29
    • 2016-05-10
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    相关资源
    最近更新 更多