How do I convert mongoose query results to plain javascript?

Viewed 645

I need help

I have a lot of confusion about using mongooses to control query results. Mongoose's query result is sometimes plane js object and sometimes mongoose object.

I want to show my confusion in code.

        (async function (){
        try{
            const user1 = await User.findOne() 
            console.log(user1.constructor) // => mongoose Object => read only

            const user2 = await User.findOne().lean()
            console.log(user2.constructor) // => javascript Object => readable and writable

            const users3 = await User.find()
            console.log(users3.constructor) // => javascript Object => readable and writable
            //Why javascript object ? Despite not using lean()func

            const user4 = await new User({
                memberType : 'local',
                id : 'myId',
                nick : 'myNick',
                isAdmin : false,
                joinDate : new Date().toISOString(),
                sex : 'm'
            })
            .save()

            console.log(user4.constructor) // => mongoose Object => read only

            const user5 = await new User({
                memberType : 'local',
                id : 'myId',
                nick : 'myNick',
                isAdmin : false,
                joinDate : new Date().toISOString(),
                sex : 'm'
            })
            .save()
            .lean()

            //TypeError: (intermediate value).save(...).lean is not a function

        }
        catch(err){
            console.log(err)
        }
    })()

so.. my questions are...

1) why users3.constructor is plane javascript object ? despite not using lean()

2) how to make mongoose object user4(save result) to plane javascript ?

(In case of user4, lean has an error.)

I would be very grateful if you could reply.

have a nice day :)

1 Answers

why users3.constructor is plane javascript object ? despite not using lean()

users3 is an Array here, an Array of mongoose object; because find return an Array of matching elements.

findOne in other hand would return you a mongoose object directly.


how to make mongoose object user4(save result) to plane javascript ?

Using the .toObject() method, lean is an option only to queries like find; it do not apply to save, as explained in here

Example :

const user5 = (await new User({
  ...
}).save()).toObject();

enter image description here

Related