mongodb - Mongodb使用$lookup查找给定_id属于哪个对象(外域是一个数组)
问题描述
考虑以下集合:
用户
{
_id : ObjectId("5e2b9ab8b1dbae5124e4b635")
name : "user1"
}
{
_id : ObjectId("5e2b9c29b1dbae5124e4b63b")
name : "user2"
}
{
_id : ObjectId("5e2b9cd2b1dbae5124e4b641")
name : "user3"
}
{
_id : ObjectId("5e2ba081b1dbae5124e4b64c")
name : "user4"
}
业务帐户:
{
_id : 5e2c5e433e8d406769286567
name : "account1"
users : [ObjectId("5e2b9cd2b1dbae5124e4b641"), ObjectId("5e2b9c29b1dbae5124e4b63b")]
}
{
_id : 4e2c5e433e8d40676928bb43
name : "account2"
users : [ObjectId("5e2b9ab8b1dbae5124e4b635")]
}
我需要确定每个用户属于哪个 business_account。(下面的期望结果)
{
_id : ObjectId("5e2b9ab8b1dbae5124e4b635")
name : "user1"
belongs_to : "account2"
}
{
_id : ObjectId("5e2b9c29b1dbae5124e4b63b")
name : "user2"
belongs_to : "account1"
}
{
_id : ObjectId("5e2b9cd2b1dbae5124e4b641")
name : "user3"
belongs_to : "account1"
}
{
_id : ObjectId("5e2ba081b1dbae5124e4b64c")
name : "user4"
}
我在网上看到很多例子说要使用 $lookup/let/pipeline 但我不知道如何使用它来获得结果。
在我尝试过的查询下方。
db.user.aggregate([
{'$lookup':
{
'from': 'business_account',
'let': { 'profile_id' : '$profile.profile_id' },
'pipeline' : [
{ "$match": { "$expr": { "$in": ["$$profile_id", "$users"] } } },
],
'as': 'account'
}
}
]);
解决方案
尝试这个 :
db.user.aggregate([
{
'$lookup':
{
'from': 'business_account',
'let': { 'id': '$_id' }, // Here let is used to create local variable of user collection
'pipeline': [
{ "$match": { "$expr": { "$in": ["$$id", "$users"] } } }
, { "$project": { name: 1, _id: 0 } } // Projecting only name
],
'as': 'belongs_to'
}
}, { $unwind: { path: "$belongs_to", preserveNullAndEmptyArrays: true } }, // unwinding belongs_to array($lookup will result in array) to object
{ $addFields: { belongs_to: '$belongs_to.name' } } /** Replacing "belongs_to" : { "name": "account2"} to "belongs_to" : "account2" */
])
测试: MongoDB-游乐场
推荐阅读
- xls - 如何在 kofax RPA 10.4 中打开 .xls 文件?
- spring-boot - Spring Boot Kafka - 与消费者不同的消息管理
- azure-billing-api - EA 使用计费中缺少 InvoiceId(或等效项)
- android-studio - Flutter build appbundle , debug-app.apk 工作正常,但 Flutter build apk 没有制作 apk 文件。这意味着什么?
- xml-parsing - 通过 Azure Logic 应用将 JSON 转换为 XML 格式
- import - 在verilog中,编译单元范围内的导入包和模块头之间有什么区别吗?
- selenium - 使用 Robot Framework 和 Excellibrary 将测试结果导出到 Excel
- javascript - 正则表达式 - 验证结束标签 - 模板引擎
- javascript - 使用基于 PHP 变量的 javascript 更改选择选项
- codenameone - 带有 GPS 位置标记的平面图