如何在Next.js中筛选MongoDB users集合指定用户的数据
MongoDB按username筛选数据的Next.js解决方案
需求说明
需要从MongoDB的users集合中筛选出仅属于user01的数据,避免为每个用户创建单独集合(受MongoDB命名空间限制)。
集合文档结构
{ "_id": { "$oid": "636a904602fa5ea137276767" }, "project_name": "project01", "username": "user01", "__v": { "$numberInt": "0" } }
当前Next.js页面代码
import dbConnect from '../../lib/dbConnect' import User from '../models/User' export default function Page({ users }) { return ( <> {users.map((user) => ( <div key={user._id}> <span>username: {user.username} project_name: {user.project_name}</span> </div> ))} </> ); } export async function getServerSideProps() { await dbConnect() const result = await User.find({}) const users = result.map((doc) => { const user = doc.toObject() user._id = user._id.toString() return user }) return { props: { users: users } } }
当前输出
username: user01 project_name: project01 username: user02 project_name: project02 username: user01 project_name: project03 username: user03 project_name: project04 username: user02 project_name: project05 username: user03 project_name: project06 username: user02 project_name: project07 username: user02 project_name: project08 username: user02 project_name: project09 username: user01 project_name: project10
期望输出
username: user01 project_name: project01 username: user01 project_name: project03 username: user01 project_name: project10
解决方案
修改getServerSideProps中的User.find()查询,添加username字段的筛选条件即可:
export async function getServerSideProps() { await dbConnect() // 添加{ username: 'user01' }作为筛选条件 const result = await User.find({ username: 'user01' }) const users = result.map((doc) => { const user = doc.toObject() user._id = user._id.toString() return user }) return { props: { users: users } } }
扩展:动态筛选不同用户
如果需要根据请求参数动态筛选用户(比如从URL中获取用户名),可以修改getServerSideProps获取context参数,从query中提取用户名:
export async function getServerSideProps(context) { await dbConnect() // 从URL query中获取username,比如访问 /users?username=user01 const targetUsername = context.query.username || 'user01' const result = await User.find({ username: targetUsername }) const users = result.map((doc) => { const user = doc.toObject() user._id = user._id.toString() return user }) return { props: { users: users } } }
内容的提问来源于stack exchange,提问作者calendo
相关产品推荐
相关产品推荐

