【发布时间】:2019-05-21 02:11:48
【问题描述】:
我正在尝试使用findOneAndUpdate 更新我存储在猫鼬服务器中的一个文档。我将其设置为 PUT 请求,这就是我定义它的方式。
public updateConfigWithType(req: Request, res: Response) {
configs.findOneAndUpdate({'companyInfo.uniquecompanyid': req.params.id}, { $set: { companyName: "ITSWORKING" }} ,(err,doc) => {
if (err) {
res.send(err);
}else {
res.json({
message: 'Succesfully updated this item'
});
}
})
}
我的 PUT 请求 URL 设置如下:http://localhost:3000/parserConfig/123123wfdwedfwfwefwef
这是我的猫鼬服务器中的文档中存在的一小部分 JSON 数据:
{
"_id": {
"$oid": "5bbf27ad4cf8a6be65ea6257"
},
"companyInfo": {
"companyName": "example",
"hashKey": "sdfsdf",
"hashFunction": "sdfsdf",
"uniquecompanyid": "123123wfdwedfwfwefwef"
},
"version": "1",
"__v": 0,
"parserConfig": {
"id": {
"fieldName": "key",
"path": "key"
},
因此,我希望能够通过 URL 中的 uniquecompnayid 找到正确的文档,并且我特别希望使用 req.body 中存在的内容更新 parserConfig 字段。为了测试目的,我现在对所有内容都进行了硬编码。发送 PUT 请求目前在 Postman 中给了我这个答案:
{"message":"Succesfully updated this item"}
但是没有任何更新。我错过了什么?
更新
出于测试目的我更改了代码...这是我尝试过的:
public updateConfigWithType(req: Request, res: Response) {
var query = {'companyInfo.uniquecompanyid':req.params.id};
configs.findOneAndUpdate(query, {$set:{'companyInfo.uniquecompanyid':"heheheheh"}}, {new:true}, function(err, doc){
if (err) {
return res.send(err);
}
return res.send(doc);
});
}
postman 中的响应是 OLD 文档。没有任何改变
spyros 请求后更新
10:26:34 PM web.1 | Mongoose: configs.findOne({ 'companyInfo.uniquecompanyid': '123123wfdwedfwfwefwef' }, { new: true, projection: {} })
10:26:34 PM web.1 | PUT /parserConfig/123123wfdwedfwfwefwef 200 158.118 ms - 2089
更新新信息通知
我遇到了这个:https://github.com/Automattic/mongoose/issues/7011
上面写着:
我注意到,当使用架构中不存在的更新文档属性调用 findOneAndUpdate 时,调试输出显示(错误)?收集方法。
为什么通过 Studio 3t 更新相同的属性而不是通过我的代码会起作用?
【问题讨论】:
-
想到的一些事情:你确认 req.params.id 被正确解析了吗?您是否确认该对象未在数据库中正确更新?您是否尝试了 update() 函数而不是 findOneAndUpdate?您是否尝试过直接使用 findOneAndUpdate 手动更新 mongo 中的文档,而不使用 mongoose,例如在 CLI 或 roboMongo 中?另外,您可以发布您的架构吗?
-
感谢您的精彩想法。它在一定程度上帮助了我。这是新闻(逐步解决您的问题): 1)很快就会出现 2)是 3)否 4)刚刚使用 Studio 3T 尝试过。运行 findOneAndOnly 确实更新了 companyName。这让我尝试在我的代码中使用完全相同的查询(所有内容都被硬编码,即使是 uniquecompanyID),但它仍然没有更新。(我猜这消除了你的第一个问题想法)。调试器仍然显示我正在执行 findOne。我们的架构是这样的
const configs = mongoose.model('configs', new mongoose.Schema()); -
请检查更新@BenSower
-
好的,但是这些字段是在 Schema 中实际定义的,还是您只是在整个定义中使用混合类型?
-
好的,刚刚看到你的更新!这实际上可能与猫鼬问题有关,这也是 3T 工作室正常工作的原因。那么您可以尝试使用所需字段手动定义您的架构吗?
标签: typescript express mongoose