MongoDB - $merge 在 Compass 中有效,但在 Node.js Lambda 中无效
MongoDB - $merge that works in Compass but not from a Node.js Lambda
我有一个聚合管道,它在 Compass 中运行良好,但当我从 NodeJS Lambda 使用它时,它什么也没做。没有错误,当然也没有连接问题或类似问题,因为我还在使用相同的连接详细信息动态插入数据和创建索引。为什么这行不通?
Lambda 代码:
// 'db' obtained from connection pooling elsewhere
await db.collection(collectionName).aggregate(aggregationStatement);
聚合语句:
[
{
"$match": {
"type": "costForecast"
}
},
{
"$sort": {
"when": 1
}
},
{
"$group": {
"_id": {
"type": "$type"
},
"when": {
"$last": "$when"
},
"type": {
"$last": "$type"
},
"serviceId": {
"$last": "$serviceId"
},
"serviceName": {
"$last": "$serviceName"
},
"data": {
"$last": "$data"
}
}
},
{
"$project": {
"when": 1,
"type": 1,
"serviceId": 1,
"serviceName": 1,
"data": "$data.ForecastResultsByTime"
}
},
{
"$merge": {
"into": "CostsOut",
"on": [ "type", "serviceId" ],
"whenMatched": "replace",
"whenNotMatched": "insert"
}
}
]
不用说,所有字段都存在,$merge 的目标集合包含支持 "on" 声明的唯一索引。我想要实现的功能是在原始集合中找到一个 "costForecast" 项目的最新示例,选择几个字段并稍微扁平化数据,然后插入或更新 "CostsOut" 集合以"type"和"serviceId"为唯一复合索引的文档
非常感谢您的帮助。
.aggregate() 不可等待,它只是 returns 游标而不是承诺。
要告诉 Mongo,它应该执行聚合,您必须调用 .toArray() 或 .forEach()
await db.collection(collectionName).aggregate(aggregationStatement).toArray();
我有一个聚合管道,它在 Compass 中运行良好,但当我从 NodeJS Lambda 使用它时,它什么也没做。没有错误,当然也没有连接问题或类似问题,因为我还在使用相同的连接详细信息动态插入数据和创建索引。为什么这行不通?
Lambda 代码:
// 'db' obtained from connection pooling elsewhere
await db.collection(collectionName).aggregate(aggregationStatement);
聚合语句:
[
{
"$match": {
"type": "costForecast"
}
},
{
"$sort": {
"when": 1
}
},
{
"$group": {
"_id": {
"type": "$type"
},
"when": {
"$last": "$when"
},
"type": {
"$last": "$type"
},
"serviceId": {
"$last": "$serviceId"
},
"serviceName": {
"$last": "$serviceName"
},
"data": {
"$last": "$data"
}
}
},
{
"$project": {
"when": 1,
"type": 1,
"serviceId": 1,
"serviceName": 1,
"data": "$data.ForecastResultsByTime"
}
},
{
"$merge": {
"into": "CostsOut",
"on": [ "type", "serviceId" ],
"whenMatched": "replace",
"whenNotMatched": "insert"
}
}
]
不用说,所有字段都存在,$merge 的目标集合包含支持 "on" 声明的唯一索引。我想要实现的功能是在原始集合中找到一个 "costForecast" 项目的最新示例,选择几个字段并稍微扁平化数据,然后插入或更新 "CostsOut" 集合以"type"和"serviceId"为唯一复合索引的文档
非常感谢您的帮助。
.aggregate() 不可等待,它只是 returns 游标而不是承诺。
要告诉 Mongo,它应该执行聚合,您必须调用 .toArray() 或 .forEach()
await db.collection(collectionName).aggregate(aggregationStatement).toArray();