【问题标题】:How to combine 2 arrays based on condition in mongoDb如何根据 mongoDb 中的条件组合 2 个数组
【发布时间】:2020-02-06 01:26:42
【问题描述】:

我有一个订单集合,其中有项目字段 [ { itemId: ObjectId, quantity: number } ]

我想使用聚合使用相应的文档填充 itemId,但查找阶段会创建一个单独的数组

想要的结果:[ { itemId: {} , quantity: number } ]

试过了: Aggregation pic

有没有办法将这些数组组合起来,这样我就能得到想要的结果,还是有其他方法?

【问题讨论】:

  • 请发布样本数据和期望的结果。您的示例是错误的 json,不清楚您要做什么
  • 在我们需要使用的地方发布示例数据$lookup
  • 在问题中添加了管道图片

标签: mongodb mongoose aggregation-framework


【解决方案1】:

在完成 $lookup 后,难道不能只使用 $unwind 和 $project 操作来覆盖 itemId 字段吗?

像这样:

db.orders.aggregate([{
    "$lookup": {
        "from": "items",
        "localField": "itemId",
        "foreignField": "_id",
        "as": "item"
    }
}, {
    "$unwind": "$item"
}, {
    "$project": {
        "_id": 0,
        "itemId": "$item",
        "quantity": 1
    }
}]);

更新

查看数据后,您可以尝试执行以下操作:

db.orders.aggregate([{
    "$unwind": "$items"
}, {
    "$lookup": {
        "from": "items",
        "localField": "items.itemId",
        "foreignField": "_id",
        "as": "item"
    }
}, {
    "$unwind": "$item"
}, {
    "$group": {
        "_id": "$_id",
        "items": {
            "$push": {
                "itemId": "$item",
                "quantity": "$items.quantity"
            }
        }
    }
}]);

第一个 $unwind 将项目数组转换为单个对象,然后可以在 $lookup 中使用这些对象从项目集合中获取它们的记录。第二个 $unwind 对新的 item 字段做同样的事情。最后的 $group 根据订单中的原始 _id 将所有内容重新组合在一起,并且 $push 将 items 字段重新格式化为您想要的。

【讨论】:

  • 两者都是数组,所以这样做会覆盖整个数组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多