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"}}
我必须更新 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"}}