如何解决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 { data } = await axios.get(`/apI/Orders/myorders/last`,config)
dispatch({
type: ORDER_LAST_SUCCESS,})
} catch (error) {
const message =
error.response && error.response.data.message
? error.response.data.message
: error.message
dispatch({
type: ORDER_LAST_FAIL,})
}
}
const SecondComponent = () => {
const dispatch = usedispatch()
const userDetails = useSelector((state) => state.userDetails)
const { loading,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())
}
},user])
console.log(orderLast)
return (
<section>
<p>{order._id}</p>
[...]
</section>
我将不胜感激任何建议或帮助。
解决方法
可以使用 findOne 和 sort _id -1 检索添加到集合中的最后一个文档
await <Model>.findOne().sort({_id:-1})
在您的情况下,您可以使用以下内容
const orders = await Order.findOne({ user: req.user._id }).sort({_id:-1})
,
在后端更新您的查询应该可以修复它。
试试这个:
const getLastOrder = asyncHandler(async (req,res) => {
const lastOrder = await Order.findOne({})
.sort({ _id: -1 })
res.json(lastOrder)
})
mongoDb 中的所有文档都使用包含插入时间戳的 _id 创建。因此,使用 _id : -1 进行排序将为您提供最新的可用文档。 此外,findOne 已经为您提供了一个文档,因此无需对其添加限制。
,您说“这对我来说不是一个完全令人满意的解决方案”。所以我认为,你可以改变“反应行动”部分。我的意思是,在客户端,您可以从 api 中捕获整个数据的最后一个“_id”。你不必做你讨厌的事。 我不知道你的代码和api的结构,所以如果有错误,请理解以下代码。
export const getMyLastOrder = () => async (dispatch,getState) => {
try {
// I will omit the unnecessary parts.
// ...
const { data } = await axios.get(`/api/orders/myorders`,config);
let max = 0;
for(let i = 0; i < data.length; i++){
let id2Number = Number('0x' + data[i]._id);
if(id2Number > max){
max = id2Number;
}
}
data = max;
dispatch({
//...
payload: data,})
} catch (error) {
// ...
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。