mongodb - 如何在 mongodb 中将两个对象与聚合合并,?
问题描述
我在合并对象时遇到问题,我有一个包含汽车属性的工厂模式,其中包含每辆车的参考,我想将工厂与最后注册的汽车合并。我有以下数据。
"Factory": {
_id: ""
"factories" : [
{
"Adress" : "...",
"name": "Factory A"
"car": [ ObjectId("5f974ac1200b1aa93fee248b") ]
},
{
"Adress" : "...",
"name": "Factory B"
"car": [ ObjectId("5f974ac1200b1aa93fee248b") ]
}
],
},
汽车收藏:
"Car" :
_id: ObjectId("5f974ac1200b1aa93fee248b")
"color" : "...",
"feature": "..."
},
我期望的输出:
[
{
"Factory A": {
"Adress" : "...",
"name": "Factory A"
"cars": {
_id: ObjectId("5f974ac1200b1aa93fee248b")
"color" : "...",
"feature": "..."
}
},
"Factory B": {
"Adress" : "...",
"name": "Factory B"
"car": {
_id: ObjectId("5f974ac1200b1aa93fee248b")
"color" : "...",
"feature": "..."
}
},
}
]
我得到的输出:
"Factory A": {
{
"Adress" : "...",
"name": "Factory A",
"car": [ ObjectId("5f974ac1200b1aa93fee248b") ]
},
"car": {
_id: ObjectId("5f974ac1200b1aa93fee248b")
"color" : "...",
"feature": "..."
}
}
"Factory B": {
{
"Adress" : "...",
"name": "Factory B",
"car": [ ObjectId("5f974ac1200b1aa93fee248b") ]
},
"car": {
_id: ObjectId("5f974ac1200b1aa93fee248b")
"color" : "...",
"feature": "..."
}
}
这是我的操作:
db.getCollection('factory').aggregate([
{ $match: { "_id": ObjectId("5f9740f38591d84413600db0") } },
{ $unwind: "$factories"},
{ $group: { _id: null, allFactories: { $addToSet: "$factories"} } },
{ $unwind: "$allFactories" },
{
$lookup: {
from: "cars",
localField: "allFactories.car",
foreignField: "_id",
as: "cars"
}
},
{ $sort: { "cars._id": -1 } },
{ $unwind: "$cars" },
{ $group: {_id:"$allFactories.name", lastMatch: { $last: "$$ROOT"} }}
请问这种方法有什么帮助吗?
解决方案
你可以试试这个查询。您将不得不稍微调整一下 ObjectIds。我使用了字符串,因为文档在 mongo 操场上给出了错误。但我认为那将是直截了当的。
db.factory.aggregate([
{
"$match": {
"_id": 1
}
},
{
$unwind: "$factories"
},
{
"$unwind": "$factories.car"
},
{
"$lookup": {
"from": "cars",
"localField": "factories.car",
"foreignField": "id",
"as": "factories.car"
}
},
{
"$unwind": "$factories.car"
},
{ "$group": {
"_id": null,
"data": {
"$push": {
"k": "$factories.name",
"v": "$factories"
}
}
}},
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$data" }
}}
])
推荐阅读
- python - PyVISA - 无法让 GPIB 仪器以编程方式进入远程模式
- apache-nifi - Nifi 连接到 sql server kerberos
- html - 是否可以在 Firefox 中播放基本身份验证背后的音频?
- symfony - Symfony 4,如何将通用控制器实现为服务?
- powershell - 如何将复杂的 sed 命令转换为 PowerShell 脚本
- angular - Angularfire 2 使用 AngularFireAuthGuard 进行基于角色的内容显示
- android - TabbedPage Toolbar 仅在 ToolbarPlacement 位于底部且 ContentPage 计数大于 4 时显示活动 ToolbarItem
- java - 线程安全的反应式缓存
- c++ - 不可能在析构函数上使用 virtual 关键字
- azure - 如何使用 Azure 本机服务(Azure 日志分析/自动化帐户)为 Azure VM 生成缺少操作系统补丁的报告?