【问题标题】:Moongose after find, object.map is not returning key猫鼬找到后,object.map 没有返回键
【发布时间】:2021-05-25 09:26:30
【问题描述】:

我有一个代码,在查找和填充之后,我将根据 createdAt 添加一个新键('order_date')。


const summaryGetOrders = async (start_date, end_date) => {
  let orders = await Order.find({ createdAt: { $gte: new Date(start_date), $lt: new Date(end_date) } }).populate(
    'orderdetails_id'
  );

  await Promise.all(
    orders.map(async (i, index) => {
      i.order_date = i.createdAt;
      // orders[index] = i
      // orders[index].order_date = i.createdAt
    })
  );

  console.log(orders);

  return orders;
};

我已经检查了 console.log(i.createdAt),它确实在 i 中有日期元素,但是当我执行 console.log(orders) 时,它并没有返回我 order_date。

是异步等待功能造成的吗?我这样做是因为我的快速样板通过我模型上的 toJSON 函数自动删除 createdAt 键。我不想修改,因为我的代码是定制的,不能处理 createdAt。

【问题讨论】:

  • i.order_date = i.createdAt; 只是一个任务。为什么要使用 Promise?
  • 因为据我所知,map 是一个异步函数,我想等待它。所以我承诺了

标签: javascript mongoose


【解决方案1】:

默认情况下,Mongoose 查询返回 Mongoose Document 类的实例,而不是普通的旧 JavaScript 对象 (POJO),因此当您 console.log 时,架构中未定义的某些字段将不会显示(您可以检查更多信息here)。

要解决这个问题,您可以在查询中使用 .lean() 以使结果变为纯 javascript 对象。

此外,您不需要使用Promise.all,因为map 不是异步的,在这种情况下使用forEach 可能会更好。

const summaryGetOrders = async (start_date, end_date) => {
  let orders = await Order.find({ createdAt: { $gte: new Date(start_date), $lt: new Date(end_date) } }).populate(
    'orderdetails_id'
  ).lean();


  orders.forEach((i, index) => {
    i.order_date = i.createdAt;
    // orders[index] = i
    // orders[index].order_date = i.createdAt
  })

  console.log(orders);

  return orders;
};

【讨论】:

  • 谢谢,解决了我的问题。马上工作,只是想知道,我什么时候应该真正使用 .map?
  • 您应该在需要创建一个新数组时使用 map,该数组填充了在调用数组中的每个元素上调用提供的函数的结果,如文档中所述:@ 987654323@
【解决方案2】:

orders.map 将返回一个新数组。 orders 变量本身不会改变。所以无论你添加什么都在新数组中。检查一下。

await Promise.all(
    orders = orders.map(async (i, index) => ({
      i.order_date = i.createdAt;
      // orders[index] = i
      // orders[index].order_date = i.createdAt
    }))
);

现在,您的订单将被重新分配给新数组,您可以获取其中的值。

【讨论】:

    【解决方案3】:

    您在返回函数中缺少“()”,因此它不会返回您在 map 中定义的新值。试试这个

    const summaryGetOrders = async (start_date, end_date) => {
      let orders = await Order.find({ createdAt: { $gte: new Date(start_date), $lt: new Date(end_date) } }).populate(
        'orderdetails_id'
      );
    
      await Promise.all(
        orders.map(async (i, index) => ({
          i.order_date = i.createdAt;
          // orders[index] = i
          // orders[index].order_date = i.createdAt
        }))
      );
    
      console.log(orders);
    
      return orders;
    };
    

    【讨论】:

    • 嗨,它是说 i.order_date = i.createdAt ^ SyntaxError: Unexpected token '.'
    • @user5109293123 试试这个:order_date : i.createdAt
    猜你喜欢
    • 2018-07-12
    • 2015-04-07
    • 2023-03-06
    • 2020-07-21
    • 2016-11-14
    • 2015-08-05
    • 2014-01-26
    • 2015-10-08
    • 2021-02-23
    相关资源
    最近更新 更多