mongodb - 基于 3 列合并两个集合
问题描述
我想加入两个名为Emp1的集合,工资基于dept,id 和 name。我想像在 pandas 合并中那样合并两者。
Emp1:
{"dept":"cs","id": 100,"name":"xxx","age": 20}
{"dept":"IT","id": 110,"name":"xxx","age": 21}
{"dept":"AI","id": 110,"name":"xxx","age": 21}
萨尔:
{"dept":"cs","id": 100,"name":"xxx","sal": 200}
{"dept":"IT","id": 110,"name":"xxx","sal": 2100}
{"dept":"AI","id": 110,"name":"xxx","sal": 2100}
输出应如下所示:
{"dept":"cs","id": 100,"name":"xxx","age": 20,"sal":200}
{"dept":"IT","id": 110,"name":"xxx","age": 21,"sal": 2100}
{"dept":"AI","id": 110,"name":"xxx","age": 21,"sal": 2100}
基于 3 列加入的最佳解决方案是什么。我知道我们可以使用查找操作,但这里的情况是基于 3 列加入..
解决方案
您可以在查找中使用管道进行多个连接,如下所示:首先,您在 let 和管道 $match 中分配要匹配的键,您只能使用 $expr 来使用条件运算符,最后我们将 $lookup 结果与使用 $mergeObjects 运算符的 $$ROOT 文档。
db.emp.aggregate([
{
$lookup: {
from: "sal",
let: {
dept: "$dept",
id: "$id",
name: "$name"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$dept",
"$$dept"
]
},
{
$eq: [
"$id",
"$$id"
]
},
{
$eq: [
"$name",
"$$name"
]
}
]
}
}
}
],
as: "result"
}
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
{
$arrayElemAt: [
"$result",
0
]
},
{
age: "$$ROOT.age"
}
]
}
}
}
])
推荐阅读
- c# - 我应该在哪里调用 C#.NET 中不兼容类型转换的打印函数?
- wordpress - Local By Flywheel - 建立数据库连接时出错
- python - 如何格式化Django表单中选择字段中的选择标签?
- python - 保持一致的 matplotlib 轴限制
- hyperledger - 超级账本交易内存池
- javascript - ReferenceError:未定义“$”
- ruby-on-rails - Rails:传递嵌套属性参数
- batch-file - 为什么当一个语句与另一个 for 循环变量一起打印时,它不与一个 for 循环变量一起打印?
- objective-c - 在目标 c 中的二维数组中重复值
- javascript - 在 Node.js Express.js 服务器中添加标头后,Chrome 中仍然出现 CORS 错误