MERN技术栈中如何从数据库中检索最后添加的记录?
我正在使用技术堆栈MERN和Redux. 我想知道如何使用moongose. 例如,假设它将是分配给特定用户的订单列表。
我已经在后端完成了一个检索所有记录的查询。它看起来像这样:
const getMyOrders = asyncHandler(async (req, res) => {
const orders = await Order.find({ user: req.user._id })
res.json(orders)
})
在前端,订单列表由以下人员提供redux action:
export const listMyOrders = () => async (dispatch, getState) => {
try {
dispatch({
type: ORDER_LIST_REQUEST,
})
const {
userLogin: { userInfo },
} = getState()
const config = {
headers: {
Authorization: `Bearer ${userInfo.token}`,
},
}
const { data } = await axios.get(`/api/orders/myorders`, config)
dispatch({
type: ORDER_LIST_SUCCESS,
payload: data,
})
} catch (error) {
const message =
error.response && error.response.data.message
? error.response.data.message
: error.message
dispatch({
type: ORDER_LIST_FAIL,
payload: message,
})
}
}
最后在reacta组件中显示:
const ProfileScreen = ({ history }) => {
const dispatch = useDispatch()
const userDetails = useSelector((state) => state.userDetails)
const { loading, error, user } = userDetails
const userLogin = useSelector((state) => state.userLogin)
const { userInfo } = userLogin
const orderList = useSelector((state) => state.orderList)
const { loading: loadingOrders, error: errorOrders, orders } = orderList
useEffect(() => {
if (!user || !user.name) {
dispatch(getUserDetails('profile'))
dispatch(listMyOrders())
}
}, [dispatch, user])
return (
<tbody>
{orders.map((order) => (
<tr key={order._id}>
[...]
</tr>
))}
</tbody>
)
}
作为该问题的部分解决方案,我自己能够做的是对 API 进行单独的查询,该 API 分别从数据库中检索最近添加的记录。然而,这对我来说并不是一个完全令人满意的解决方案,因为它重复了我已经编写的一些代码。现在我的问题是我是否可以以其他方式做到这一点,以便它可以将最后一个订单交付给另一个react组件?
const getLastOrder = asyncHandler(async (req, res) => {
const lastOrder = await Order.findOne({})
.sort({ orderDate: -1 })
.limit(1)
.populate('user', 'name email')
res.json(lastOrder)
})
export const getMyLastOrder = () => async (dispatch, getState) => {
try {
dispatch({
type: ORDER_LAST_REQUEST,
})
const {
userLogin: { userInfo },
} = getState()
const config = {
headers: {
Authorization: `Bearer ${userInfo.token}`,
},
}
const { data } = await axios.get(`/api/orders/myorders/last`, config)
dispatch({
type: ORDER_LAST_SUCCESS,
payload: data,
})
} catch (error) {
const message =
error.response && error.response.data.message
? error.response.data.message
: error.message
dispatch({
type: ORDER_LAST_FAIL,
payload: message,
})
}
}
const SecondComponent = () => {
const dispatch = useDispatch()
const userDetails = useSelector((state) => state.userDetails)
const { loading, error, user } = userDetails
const userLogin = useSelector((state) => state.userLogin)
const { userInfo } = userLogin
const orderLast = useSelector((state) => state.orderLast)
const { order } = orderLast
useEffect(() => {
if (!user || !user.name) {
dispatch(getUserDetails('profile'))
dispatch(getMyLastOrder())
}
}, [dispatch, user])
console.log(orderLast)
return (
<section>
<p>{order._id}</p>
[...]
</section>
我将不胜感激任何建议或帮助。