序: 使用Express创建REST API,专门用于对“scheduledReports”下面的mongo User集合项执行CRUD操作。 它是一个数组,用于存储在前端创建的报表对象。 集合中的每个用户以及属于该用户的任何报表都将具有唯一的ObjectId作为标识符。
案例:用户想要更新其馆藏中的报告。
问题:PUT请求首先需要在集合中找到用户,然后它应该找到用户想要操作的报表。搜索将基于它们的ObjectIds。如何在Mongoose中实现这一目标?
Users Collection
{
"_id": ObjectId("54c7ed6c4aac70e63c6e8e3d")
"username" : "test",
"email" : "test@system.com",
"scheduledReports" : [
{
"_id" : ObjectId("54ea4d490d24155a73497dc4"),
"reportURI" : "report",
"frequency" : "hourly|daily|weekly|monthly",
"optionalMsg" : "optionalMsg",
"subject" : "subject",
"recipient" : "hugurlu@paypal.com",
"attachments" : [
"pdf|png|csv"
]
},
....
简化信息:利用mongoose,使用ObjectID访问Users集合中的用户,然后使用给定的ObjectId再次访问“scheduledReports”数组中的元素。 到达该元素后,使用新的更新对象替换其中的值(ObjectId除外)。
答案 0 :(得分:0)
你想要的可能是positional operator。
如果user
是收集模型。假设您在ob
//assuming you get the _id's from the front end in the ob object
//this is more useful when you have simple manipulation on the report
user.update({_id:ob.user_id,scheduledReports:ob.report_id},
{"scheduledReports.$":<your new obj>},function(err,doc){
});
//or
user.update({_id:ob.user_id,scheduledReports:ob.report_id},
{<update operator>:{"scheduledReports.$":<your new obj>}},function(err,doc){
});
// you can also use "scheduledReports.$.field" to update that field
或者另一种方法是
user.findOne({_id:ob.user_id, scheduledReports:ob.report_id},function(err,doc){
if(!err&&doc){
//doc.scheduledReports will have the array
//you need to manually search for the particular report id in that array
// and then manipulate
//This is more useful when you have complex manipulations.
}
});
答案 1 :(得分:0)
如果引号中的第二个查询参数和需要访问的字段被赋予,则它可以工作。
User.update({username: userId, "scheduledReports._id": ob.report_id},
{$set{"scheduledReports.$": <new obj> }},function(err,doc){
//"scheduledReports.$.field" can be used to update that field
console.log(doc); //if operation is successful doc returns 1, otherwise 0
});