繁体   English   中英

mongodb从多个集合中聚合更新查询而不分组

[英]mongodb update query in aggregation from multiple collections without grouping

我可以根据来自不同集合的匹配键更新特定集合中的特定字段吗,即假设我有 3 个集合

 **///collection 1: col1///**

    _id:ObjectId("#####7b")
    name:'name1',
    itemsBought:
   [
        {
         "_id":ObjectId("####c1"
          "itemName" : "name1",
          "itemCode" : "IT001",
          "itemQuantity" : 19,
         "itemPrediction":23
         },
        {
         "_id":ObjectId("####c2"
         "itemName" : "name2",
         "itemCode" : "IT002",
         "itemQuantity" : 79,
         "itemPrediction":69
        },
        {
        "_id":ObjectId("####c3"
        "itemName" : "name2",
         "itemCode" : "IT003",
         "itemQuantity" : 0,
         "itemPrediction":0
         },
    ]

    **///collection 1: col2///**

    {
      "itemQuantity" : 21,
      "itemCode" : "IT001",
      },
    {
      "itemQuantity" : 2,
      "itemCode" : "IT003",
      }

    **///collection 1: col3///**

    {
    "itemCode" : "IT001",
    "itemPrediction":23
    },
    {
    "itemCode" : "IT002",
    "itemPrediction":12
    },
    {
    "itemCode" : "IT003",
    "itemPrediction":7
    },

我正在使用 $aggregation $lookup 来获取所有需要的数据,在将它发送到前端之前,我需要从 col2 获取 itemQuantity 的值,从 col3 获取 itemPrediction 的值,并使用匹配的 itemCode 更新 col1 中的值。 所以我有一个查询,它从所有集合中提取所有数据,但我不知道如何使用 $set 来更新 col1 中的值。

解决方法:您可以执行聚合并手动保存结果

db.col1.aggregate([
  {
    $lookup: {
      from: "col2",
      let: {
        root_itemCode: "$itemsBought.itemCode"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$itemCode",
                "$$root_itemCode"
              ]
            }
          }
        }
      ],
      as: "col2"
    }
  },
  {
    $lookup: {
      from: "col3",
      let: {
        root_itemCode: "$itemsBought.itemCode"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$itemCode",
                "$$root_itemCode"
              ]
            }
          }
        }
      ],
      as: "col3"
    }
  },
  {
    $addFields: {
      itemsBought: {
        $map: {
          input: "$itemsBought",
          as: "item",
          in: {
            "_id": "$$item._id",
            "itemName": "$$item.itemName",
            "itemCode": "$$item.itemCode",
            "itemQuantity": {
              $let: {
                vars: {
                  input: {
                    $arrayElemAt: [
                      {
                        $filter: {
                          input: "$col2",
                          cond: {
                            $eq: [
                              "$$item.itemCode",
                              "$$this.itemCode"
                            ]
                          }
                        }
                      },
                      0
                    ]
                  },
                  default: "$$item.itemQuantity"
                },
                in: {
                  $ifNull: [
                    "$$input.itemQuantity",
                    "$$default"
                  ]
                }
              }
            },
            "itemPrediction": {
              $let: {
                vars: {
                  input: {
                    $arrayElemAt: [
                      {
                        $filter: {
                          input: "$col3",
                          cond: {
                            $eq: [
                              "$$item.itemCode",
                              "$$this.itemCode"
                            ]
                          }
                        }
                      },
                      0
                    ]
                  },
                  default: "$$item.itemPrediction"
                },
                in: {
                  $ifNull: [
                    "$$input.itemPrediction",
                    "$$default"
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  {
    $unset: [
      "col2",
      "col3"
    ]
  }
])

蒙戈游乐场

猫鼬

Collection1.aggregate([...], function (err, result) {

    if(err) console.log("error-agg: " + err);

    result.forEach(function(item) {
        Collection1.updateOne({_id:item._id}, {$set:item}, function (err) {
            if(err) console.log("error-saving: " + err);
        });
    });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM