首页 > 解决方案 > async await mongodb find 过滤器不起作用,我怎样才能使它起作用?

问题描述

我希望代码不返回除了返回的数据库对象中的特定值之外的所有内容,但即使在放入过滤器之后它仍然返回不需要的值。这是我正在使用的代码。我试图从对象中删除的字段是“ss”。过滤器功能的编写类似于 MongoDB 文档告诉我的操作,但我遗漏了一些东西。

客户端

this.blocks = await CatService.getAllBlocks()

    static getAllBlocks() {
        let result = new Promise ((resolve, reject) => {
            axios
                .get(`/api/cats/read-all`)
                .then((res) => {
                    const data = res.data
                    console.log('RETURNED DATA:', data)
                    resolve(
                        data.map((block) => ({
                            ...block,
                            createdAt: new Date(block.createdAt)
                        }))
                    )
                })
                .catch((err)=> { reject(err) })
        })

        return result
    }

服务器代码

router.get('/read-all', async (req, res) => {
    const blocks = await loadBlocksCollection()
    let retrievedData = await blocks.find(
        {},
        { "ss": 0 }
    ).toArray()

    res.send(retrievedData)
})

async function loadBlocksCollection() {
    const uri = process.env.MONGO_URI
    const db_name = process.env.DB || 'db_name'
    const c_name = 'blocks'

    const client = await mongodb.MongoClient.connect(
        uri,
        {
            useNewUrlParser: true,
            useUnifiedTopology: true
        }
    )

    return client.db(db_name).collection(c_name)
}

标签: javascriptnode.jsasync-await

解决方案


这不是正确的语法:

let retrievedData = await blocks.find(
        {},
        { "ss": 0 }
    ).toArray()

过滤数据的正确方法是这样的:

let retrievedData = await blocks.find(
    {}
).project({ ss: 0 }).toArray()

推荐阅读