使用聚合管道和$lookups的MONGODB updateMany

3
我需要更新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"}}));


聚合的结果是您需要的,问题出在哪里?如果没有数据,很难有人帮助,也许可以一步一步地查看问题发生的位置,如果找到了问题,如果您能发送一些示例数据和所需的输出,那就更好了。 - Takis
问题在于执行forEach时出现了错误“无法与未定义进行比较”。聚合功能完美运行。 - Juan Zelada
检查一下 db.Merchants_INFRADB1230,它是一个集合吗?为什么你在上面的操作中使用了不同的方式?试试 db.getCollection("Merchants_INFRADB1230"),同时确保 doc._id 没有问题。 - Takis
1个回答

1
聚合返回具有3个字段的文档(您明确删除了_id):
"Institutions.GlobalId"
"Merchants_INFRADB1230.AcquireMerchant.Gateway"
"Merchants_INFRADB1230.MID"

因此,在forEach中,doc对象仅具有那些字段,并且doc._id将未定义,如果允许其未定义,则过滤器{_id:doc._id}将不匹配任何内容。

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

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

你说得对,我已经移除了_id!那是个错误哈哈!但是"Merchants_INFRADB1230"不是一个字段,它是集合的名称,但你也是对的,它没有任何作用。我之前这样使用是因为在聚合查询中,我通常需要调用完整的名称(集合和字段)。现在查询可以运行了,因为它需要循环遍历50000条记录。 - Juan Zelada
成功了,添加了 _id 并从 forEach 中删除了 "Merchants_INFRADB1230"。 - Juan Zelada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接