2

I have a Session collection. The collection is as follows:

_id:ObjectId(5ce3c94f0e259e7370966c63)
status:Int32(1)
title:String(dfsb)
content:String(fdbfdbfd)
Array(visits):[
]
Array(visits_online):[
    0:Object
        start:Date(2019-05-22T08:06:50.222+00:00)
        _id:ObjectId(5ce5031ae8ee2e83b9ab23ff)
        session_id:ObjectId(5ce3c94f0e259e7370966c63)
        user_id:ObjectId(5ce4f290e2971cc6791e5a11)
        end:Date(2019-05-22T08:06:51.438+00:00)
    1:Object
        start:Date(2019-05-22T08:07:11.512+00:00)
        _id:ObjectId(5ce5032fe8ee2e83b9ab2403)
        session_id:ObjectId(5ce3c94f0e259e7370966c63)
        user_id:ObjectId(5ce4f290e2971cc6791e5a11)
        end:Date(2019-05-22T08:07:11.791+00:00)
]

What I need: I want to move a subdocument from the visits_online array to the visits array

_id:ObjectId(5ce3c94f0e259e7370966c63)
status:Int32(1)
title:String(dfsb)
content:String(fdbfdbfd)
Array(visits):[
        0:Object
        start:Date(2019-05-22T08:06:50.222+00:00)
        _id:ObjectId(5ce5031ae8ee2e83b9ab23ff)
        session_id:ObjectId(5ce3c94f0e259e7370966c63)
        user_id:ObjectId(5ce4f290e2971cc6791e5a11)
        end:Date(2019-05-22T08:06:51.438+00:00)
]
Array(visits_online):[
    1:Object
        start:Date(2019-05-22T08:07:11.512+00:00)
        _id:ObjectId(5ce5032fe8ee2e83b9ab2403)
        session_id:ObjectId(5ce3c94f0e259e7370966c63)
        user_id:ObjectId(5ce4f290e2971cc6791e5a11)
        end:Date(2019-05-22T08:07:11.791+00:00)
]

What I tried to do:

Session.update({ _id: '5ce3c94f0e259e7370966c63', 'visits_online._id': mongoose.Types.ObjectId('5ce5031ae8ee2e83b9ab23ff') },
        {
            $pull: { 'visits_online._id': mongoose.Types.ObjectId('5ce5031ae8ee2e83b9ab23ff') },
            $push: { visits: mongoose.Types.ObjectId('5ce5031ae8ee2e83b9ab23ff') },
        })

I would be grateful for any help.

Arthor
  • 21
  • 3

1 Answers1

1

There is a slight mistake in your mongo query, you need to tell mongo which array to pull object from.

Also, you need to pass ObjectId instead of string to match against _id in update query.

Currently you are passing it as _id : '5ce3c94f0e259e7370966c63' , but is should be _id : _id: mongoose.Types.ObjectId('5ce3c94f0e259e7370966c63')

Try this :

Session.update({ 
    _id: mongoose.Types.ObjectId('5ce3c94f0e259e7370966c63'), 
    'visits_online._id': mongoose.Types.ObjectId('5ce5031ae8ee2e83b9ab23ff') 
},{
    $pull: { visits_online :  { _id: mongoose.Types.ObjectId('5ce5031ae8ee2e83b9ab23ff') }},
    $push: { visits: mongoose.Types.ObjectId('5ce5031ae8ee2e83b9ab23ff') },
})

For more info read mongodb $pull documentation. I hope it helps!

Ravi Shankar Bharti
  • 8,922
  • 5
  • 28
  • 52