[英]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.