简体   繁体   中英

How to specify and update an object within array in MongoDB

I'm trying to update the values of an object placed inside the array.

The MongoDB schema is as follows:

const ServiceStatus = new Schema({
    CustomerName : { type : String},
    CustomerNumber : {type : String},
    ServiceName : {type : String},
    Details : {type: String},
    Date : {type: String},
    Status : {type : String},
    Comments : {type : String},
    ServiceId : {type: Schema.Types.ObjectId},
    CustomerId : {type: Schema.Types.ObjectId},
    ServiceProvider : {type: Schema.Types.ObjectId},
    message : [{
        sender : {type: String},
        content : {type : String},
        time : {type : String}
    }]
})

and the snippet of the route is

router.put('/message/customer/:id',(req, res) => {
    const id=req.params.id;
    Status.findByIdAndUpdate({_id : id}, 
        {
            $push : {
                "message.$.sender": "Customer" ,
                "message.$.content": req.body,
                "message.$.date" : new Date()

            }
        }
    ,{ useFindAndModify: false } )
        .exec((err, status) => res.json(status))
})

When I tried running it on postman it doesn't get updated but I don't get any error. I want to know how I should change the router to make it work.

I think it should be like this one:

db.ServiceStatus.insertOne(
   {
      CustomerName: "the name",
      message: [{ sender: "Customer", content: "some content", time: new Date() }]
   }
);

db.ServiceStatus.updateOne(
   { CustomerName: "the name" },
   {
      $push: {
         message: { sender: "Another customer", content: "more content", time: new Date() }
      }
   }
)

db.ServiceStatus.find()   

{ 
    "_id" : ObjectId("5fdc4f14d1d3de1f92780a0b"), 
    "CustomerName" : "the name", 
    "message" : [
        {
            "sender" : "Customer", 
            "content" : "some content", 
            "time" : ISODate("2020-12-18T07:41:24.166+0100")
        }, 
        {
            "sender" : "Another customer", 
            "content" : "more content", 
            "time" : ISODate("2020-12-18T07:41:26.328+0100")
        }
    ]
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM