MONGODB updateMany 使用聚合管道和 $lookups

MONGODB updateMany using aggregation pipeline and $lookups

我必须更新 Merchants 集合中的“AcquireMerchant.Gateway”列,但要获得我必须更新的确切记录数量,需要对 Banks 集合和 Institution 集合进行两次查找。

这是我正在处理但不起作用的查询。

问题是当它执行 forEach 时我得到了这个错误“无法与未定义的进行比较”。聚合工作完美

db.getCollection("Merchants_INFRADB1230").aggregate( 
[
  {
    "$project": {
      "Merchants_INFRADB1230": "$$ROOT",
      "_id": 0
    }
  },
  {
    "$lookup": {
      "as": "Bancos",
      "foreignField": "_id",
      "from": "Bancos",
      "localField": "Merchants_INFRADB1230.SellingBankId"
    }
  },
  {
    "$unwind": {
      "path": "$Bancos",
      "preserveNullAndEmptyArrays": true
    }
  },
  {
    "$lookup": {
      "as": "Instituciones",
      "foreignField": "_id",
      "from": "Instituciones",
      "localField": "Bancos.InstitucionesId"
    }
  },
  {
    "$unwind": {
      "path": "$Instituciones",
      "preserveNullAndEmptyArrays": true
    }
  },
  {
    "$match": {
      "Instituciones.GlobalId": "4fb8bc86af95",
      "Merchants_INFRADB1230.AcquireMerchant.Gateway": "Update1"
    }
  },
  {
    "$project": {
      "Instituciones.GlobalId": 1,
      "Merchants_INFRADB1230.AcquireMerchant.Gateway": 1,
      "Merchants_INFRADB1230.MID": 1
    }
  }
]).forEach(doc => db.Merchants_INFRADB1230.updateMany(
       { _id: doc._id },
       { $set: { "Merchants_INFRADB1230.AcquireMerchant.Gateway": "Update2"}}));

包含 3 个字段的聚合 returns 文档(您明确删除了 _id):

"Institutions.GlobalId"
"Merchants_INFRADB1230.AcquireMerchant.Gateway"
"Merchants_INFRADB1230.MID"

所以在 forEach 中,doc 对象将只有那些字段,而 doc._id 将是未定义的,这将使过滤器 {_id:doc._id} 不匹配任何内容, 如果允许未定义。

字段 "Merchants_INFRADB1230" 是在聚合中创建的,因此集合中的文档中不存在该字段,因此更新操作可能会引用这些文档中存在的字段:

{ $set: { "AcquireMerchant.Gateway": "Update2"}}