访问作为mongodb中的集合项的数组元素

时间:2015-02-25 20:49:16

标签: node.js mongodb express mongoose

序: 使用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除外)。

2 个答案:

答案 0 :(得分:0)

你想要的可能是positional operator。 如果user是收集模型。假设您在ob

中从前端获取了对象ID
//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
});