首页 > 解决方案 > MongoDb Projection 不过滤返回数据

问题描述

函数声明:

static getUserInDatabase = ( userId ) => {
        const db = getDb();
        return db.collection( process.env.USERSCOLLECTION ).findOne( { _id: ObjectId( userId ) }, { name: 1 } );

    };

函数调用

exports.getFriend = async ( req, res, next ) => {
    const friend = await User.getUserInDatabase( req.body.friendId.id );
    if ( friend !== null ) {
        res.status( 200 ).send( friend );
    } else {
        res.status( 200 ).send( { message: "Did not find a friend with that ID" } );
    }
};

MongoDB 用户文档

{
  _id: 5dfa24dce9cbc0180fb60226,
  tokens: [],
  friends: [ 5dfa26f46719311869ac1756, 5dfa270c6719311869ac1757 ],
  incomingFriendRequest: [],
  incomingSpaceInvites: [],
  name: 'Account 1',
  email: 'account1@gmail.com',
  password: '$2b$10$OzHulmDup8btvdWw5.XnMetRprlh/m3q6ydgFRkNqmYMtvyuRAlGu',
  spaces: [ 5e16fcbabc23c11124cebf0e, 5e171c544f9bff15aafae505 ],
  tasks: []
}

调用该函数时,我希望只收到{_id: 5dfa24dce9cbc0180fb60226, name: Account 1} 但是,我收到了文档中的所有内容。

我用错了吗?当想要过滤掉响应字段时,我所看到的任何地方都与我完全相同。

谢谢

标签: node.jsmongodb

解决方案


我假设您使用的是Node.js MongoDB 驱动程序 API

在文档之后,第二个参数findOne是选项(不仅用于投影)。你必须像这样使用它:

.findOne({
    _id: ObjectId(userId),
 }, {
  projection: {
     name: 1,
  },
})

推荐阅读