如何将猫鼬查询结果转换为纯JavaScript?

时间:2018-09-14 03:46:38

标签: database mongodb mongoose

我需要帮助

我对使用猫鼬控制查询结果有很多困惑。 猫鼬的查询结果有时是平面js对象,有时是猫鼬对象。

我想在代码中显示我的困惑。

        (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)
        }
    })()

所以..我的问题是...

1)为什么users3.constructor是平面javascript对象?尽管没有使用lean()

2)如何使猫鼬对象user4(保存结果)平面化javascript?

(对于user4,lean会出错。)

如果您能答复我将不胜感激。

祝你有美好的一天:)

1 个答案:

答案 0 :(得分:0)

  

为什么users3.constructor是平面javascript对象?尽管不使用   lean()

users3Array,是猫鼬对象的Array;因为find返回匹配元素的Array

另一方面,

findOne会直接向您返回一个猫鼬对象。


  

如何使猫鼬对象user4(保存结果)平面化javascript?

使用.toObject()方法,lean仅是对find之类的查询的选择;如here

所述,它不适用于save

示例

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

enter image description here