Dapatkah saya memperbarui bidang tertentu dalam koleksi tertentu sesuai dengan kunci yang cocok dari koleksi yang berbeda, misalnya saya memiliki 3 koleksi

 **///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
    },

Saya menggunakan $agregasi $lookup untuk mengambil semua data yang diperlukan, sebelum mengirimnya ke frontend saya perlu mengambil nilai itemQuantity dari col2 dan itemPrediction dari col3 dan memperbaruinya di col1 dengan itemCode yang cocok. Jadi saya memiliki kueri yang mengambil semua data dari semua koleksi tetapi saya tidak tahu cara menggunakan $set untuk memperbarui nilai di col1.

0
sachin 5 Maret 2020, 22:57

1 menjawab

Jawaban Terbaik

Solusi: Anda dapat melakukan agregasi dan menyimpan hasilnya secara manual

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"
    ]
  }
])

Taman Bermain Mongo

Luwak

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);
        });
    });
});
1
Valijon 6 Maret 2020, 20:28