Skip to content
Advertisement

Unable to select certain fields in MongoDB (Mongoose) result

I’ve ran into a bit of an odd issue with a mongoose result. I can select one value from the object, but not another.

For example I’m calling

Product.find({"name": {$regex: search), '$options': 'i'}})
            .select('dropDate storePrice totalLikes')
            .limit(1)
            .exec((err, product) => {
                if (err) console.log('[ERROR] Unable to get product. ', err)
                console.log('Product found is: ', product)
                console.log('storePrice is: ', product[0].storePrice)
                console.log('dropDate is: ', product[0].dropDate)
                console.log('totalLikes is: ', product[0].totalLikes)
                resolve(product)
            })

I get a result and im console logging out the entire product. The result is:

Product found is:  [
  {
    _id: new ObjectId("614f5c8f4b004b4d4dc82e4f"),
    storePrice: 6.99,
    dropDate: 2021-08-21T15:00:00.000Z,
    totalLikes: 2158
  }
]

I can log out the storePrice field

storePrice is:  6.99

However if I try to log out the dropDate and totalLikes fields I get undefined

drop date is:  undefined
totalLikes is:  undefined

Any ideas why these fields are returning undefined when i try to access them? Even though they exist in the object?

Advertisement

Answer

It’s because Mongoose by default hydrate the documents returned, so they are not pure JavaScript objects.

If you want to return pure JavaScript objects, you should add .lean() to your query. That will in addition increase the performance:

Product.find({"name": {$regex: search), '$options': 'i'}})
            .select('dropDate storePrice totalLikes')
            .limit(1)
            .lean()

You can find more info in the official docs.

9 People found this is helpful
Advertisement