mongodb - 展开包含的 Mongo 文档
问题描述
这是给 MongoDB
我有一个文件说Employee
如下:
{
"_id":"e01",
"name":"Andy",
"salary":"10000",
"address":"ad01id"
}
这是一个简单的员工文档,地址是文档的外键,Address
如下所示(对于上面的员工)
{
"_id": "ad01id",
"pin":"999",
"Home":{
"street":"101",
"city":"someCity"
},
"Country":"someCountry"
}
我需要帮助来编写一个查询,该查询将获取一个Employee
但会给我一个输出,该输出的Employee
'address
字段将随着其整个文档扩展为
{
"_id":"e01",
"name":"Andy",
"salary":"10000",
"address":{
"pin":"999",
"Home":{
"street":"101",
"city":"someCity"
},
"Country":"someCountry"
}
}
我已经尝试$lookup
但$merge
无法获得所需的输出 -$merge
如果后面的文档具有相同的密钥,则隐藏早期文档中的密钥,这在我的真实场景中就是这种情况。我的实际文档有一些同名的键。例如name
在我的两个实际文档中都有。
提前致谢!
解决方案
需要$lookup来“加入”来自两个集合的数据,并且$unwind或$arrayElemAt可用于将作为结果的数组转换$lookup
为嵌套子文档:
db.Employee.aggregate([
{
$lookup: {
from: "Address",
localField: "address",
foreignField: "_id",
as: "address"
}
},
{
$addFields: {
address: { $arrayElemAt: [ "$address", 0 ] }
}
},
{
$project: {
"address._id": 0
}
}
])
推荐阅读
- c# - Stretch last DataGrid column
- node.js - 致命错误:接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足
- spring-boot - 带有 Gradle 的 Spring Boot Thin Jar 不起作用
- google-analytics - Google Analytics 未显示过去 6 个月的数据
- javascript - 开玩笑 - 如何分解未编译的模块?
- google-cloud-firestore - 我是否需要 Google Firestore 的监听器和推送通知?
- netsuite - 为什么 NetSuite 在窗体中添加两个相同的按钮?
- c++ - 通过编译器在 C++ 中设置 Bool 的默认值
- azure - 使用 Azure 逻辑应用在存储帐户容器中创建新文件夹时动态获取 blob 内容
- ios - Flutter:CocoaPods 的 specs 存储库过时,无法满足依赖关系