Express Mongoose不是$setting array。$.booleanValue,当我找到doneAndupDate({paramOne:p,paramtow2,array.keyName:valueName})时
我试图通过Express Mongoose不是$setting array。$.booleanValue,当我找到doneAndupDate({paramOne:p,paramtow2,array.keyName:valueName})时,express,mongoose,postman,Express,Mongoose,Postman,我试图通过 app.post("/api/post/:chorecomplete", function(req, res){ Parent.findOneAndUpdate({parentFirstName: req.body.parentFirstName, parentLastName: req.body.parentLastName, "chores.choreName": "firstChore"}, {$set: {"chores.$.complete": "
app.post("/api/post/:chorecomplete", function(req, res){
Parent.findOneAndUpdate({parentFirstName: req.body.parentFirstName, parentLastName: req.body.parentLastName, "chores.choreName": "firstChore"}, {$set: {"chores.$.complete": "true"}}).exec(function(err, doc){
if (err){ console.log(err); res.send("not ok");}
else{
console.log(doc);`enter code here`
res.send(ok);
}
})
})
}
我的服务器记录mongoose响应,但不是因为我也在告诉它。我对console.log(doc)进行了注释,它对它进行了测试,以查看我的数据库是否返回了它,或者我的服务器是否记录了它。问题是,我的服务器响应为“Ok”,这意味着mongoose没有抛出错误,但它没有修改我的
POST/api/POST/200 17.378毫秒-2
[1] {id:597aa48313cf6914905916e0,
[1] parentFirstName:“firstName”,
[1] parentLastName:“lastName”,
[1] 家长电邮:'mich@ael.com',
[1] __v:0,
[1] 儿童:[],
[1] 家务:
[1] [{choreName:'firstChore',
[1] ChoreDescription:“firstDescription”,
[1] 值:null,
[1] 完成:false},
[1] {choreName:'secondChore',
[1] choreDesc:“第二个描述”,
[1] choreValue:null,
[1] 完成:false}]}
我不知道我做错了什么。这里有一个静态查询参数,但“firstChore”最终将是req.body.choreName。我开始怀疑我是否应该为琐事创建一个集合,并将其引用到我的父模式和子模式,但我不能100%确定如何实现对父模式和子模式的引用,这将相互引用。。。(父项和子项都有单独的用户帐户,子项将更新要完成的杂务,并将收到杂务值[在本例中应为$5.00,但出于某些原因,mongoose不接受它。除表单值外,当前未在任何位置定义它。]。这是一个示例模式。(我正在尽可能详细地回答。时间不早了,这是我在这里的第一个问题。)
```//父模式
var mongoose=要求(“mongoose”);
var Schema=mongoose.Schema
var ParentSchema=新模式({
父名:{
类型:字符串,
必填项:true
},
}))
var Parent=mongoose.model(“Parent”,ParentSchema)
module.exports=父级
```
这是向数组添加杂务的路径。它将是形式值。与显式定义为自己的模型不同,琐事是在该路径中动态有效地定义的。
//插入杂务的路径
app.post(“/api/post/:chores”),函数(req,res){
//当有人登录时,我们将从他们的状态中获取一个值(id或电子邮件),并替换我的名字。这只是我的名字b/c,这是我最初插入数据库的名字。
//如果chores==chores,那么findAll else如果{var thechorestofind===req.params.chores},我们将运行该chores来更新一个chores?
var parentFirstName=req.body.parentFirstName;
var parentLastName=req.body.parentLastName;
var choreName=req.body.choreName;
var choreDesc=req.body.choreDesc;
var choreValue=req.body.choreValue;
Parent.findOneAndUpdate({parentFirstName:req.body.parentFirstName,parentLastName:req.body.parentLastName},{$push:{choreName:choreName,choreDesc:choreDesc,choreValue:choreValue,complete:false}}})。exec(函数(err,doc){
if(err){console.log(err)}
控制台日志(doc);
})
res.send(“Ok”);
})//结束新的家务
这是令人难以置信的长篇大论。我只是不想让我提出来的任何东西不在这里作为参考。如果你能做到这一点。谢谢。可能的问题
这看起来可能是您的Express routes而不是MongoDB的问题
代码的其余部分看起来有效,但您有一个名为/api/post/:chores的post
路由和另一个路由名/api/post/:chorescomplete
尽管参数名称不同,但Express实际上会将这些路由解释为相同的,因为冒号使参数成为通配符,可以是传递给它的任何值
在Express中,属性附加到app
的顺序非常重要
在这种情况下,假设您没有任何其他与/api/post/:parameter
模式匹配的post
路由,如果/api/post/:choreos
是在/api/post/:chorecomplete
之前编写的,那么对/api/post/:chorecomplete
的任何post请求都将实际匹配/api/post/:chores
,并运行该路由中的代码
这可能是您得到OK
响应且控制台不可用的原因
记录数据库中的文档,因为您实际上正在发布到/api/post/:chores
,并运行一个成功的查询
解决方案
有几种方法可以解决这个问题,所有这些方法都围绕着改变路线的路径。这完全取决于您的命名模式以及您计划如何访问数据
由于所讨论的代码正在更新现有文档,您可以将其改为put
路由
app.put(“/api/post/:chorecomplete”),函数(req,res){…}
或者,您可以将其保留为post
,并将另一个名称附加到路径中,使其不再与代码中的另一条路径匹配:
app.post(“/api/post/chorecomplete/:parameter”,函数(req,res){…}
可能的问题
这看起来可能是您的Express routes而不是MongoDB的问题
代码的其余部分看起来有效,但您有一个名为/api/post/:chores的post
路由和另一个路由名/api/post/:chorescomplete
尽管参数名称不同,但Express实际上会将这些路由解释为相同的,因为冒号使参数成为通配符,可以是传递给它的任何值
在Express中,属性附加到app
的顺序非常重要
在这种情况下,假设你不
parentLastName: {
type: String,
required: true
},
parentEmail: {
type: String,
required: true,
validate: [
function(input){
input.length >= 3;
},
"Email must be a valid email"
]
},
password: {
type: String,
//required: true,
validate: [
function(input){
input.length >= 6;
},
"Password must be at least 6 characters"
]
},
chores: {
type: Array,
},
children: [{
type: Schema.Types.ObjectId,
ref: "Child"
}]