【问题标题】:MongoDB - $toString'ing a field of an embedded document array in an aggregationMongoDB - $toString'ing 聚合中嵌入文档数组的字段
【发布时间】:2021-10-24 02:13:47
【问题描述】:

我有一个用户集合和一个用户订单集合。 当我检索用户时,我将所有订单添加到返回的结构中以使客户端更简单。 但是,我使用的是 NextJS,因此像 Date 和 ObjectId 这样的对象必须在到达客户端之前进行 toString 处理。 我在 JS 中手动进行了这些类型转换和用户和订单之间的链接,但是在 Mongo 驱动程序中这样做会清理我的代码很多。 所以现在我正在查看聚合,添加订单很简单,但是我无法终生了解或谷歌如何引用订单的 _id 字段(或其他字段)将其转换为字符串。

这是聚合的样子:

[
  {
    $lookup: {
      from: 'orders',
      localField: 'id',
      foreignField: 'user_id',
      as: 'orders',
    },
  },
  { 
    $project: {
      _id: { $toString: '$_id' },
      name: 1,
      'orders._id': { $toString: '???' },
      'orders.order': 1,
    },
  }
]

我在“orders._id”部分放了什么?我尝试了很多组合,但我得到的最好的是 Mongo 抱怨我正在尝试将数组转换为字符串。

给定一个用户

{ _id: ObjectId('objectId1'), id: 'id', name: 'name' }

还有订单

{ _id: ObjectId('objectId2'), user_id: 'id', order: { ... } }

最终结果应该是

{ _id: 'objectId1', name: 'name', orders: [ { _id: 'objectId2', order: { ... } } ] }

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    由于orders 是一个数组,orders._id 是一个包含orders 中对象的所有_id 字段的数组。

    为了修改每个元素,您需要展开数组、项目,然后分组;或使用 reduce、map 或类似的东西来修改每个元素。

    【讨论】:

    • 我觉得这很奇怪,因为通常在投影中引用嵌入式文档字段没有问题,但听起来对它们进行任何转换(在这种情况下为 $toString)都需要实际映射。感谢您的回答
    • 只是为了帮助您理解,尝试投射'orders._id': "$orders._id" 以查看实际返回的内容。
    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2019-05-10
    • 2019-02-16
    相关资源
    最近更新 更多