微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MERN技术栈中如何从数据库中检索最后添加的记录?

如何解决MERN技术栈中如何从数据库中检索最后添加的记录?

我正在使用技术堆栈 MERNRedux 创建一个应用程序。我想知道如何使用 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 举报,一经查实,本站将立刻删除。