Ale*_*erd 13 mongodb mongodb-query aggregation-framework
我有下一个mongo代码:
db.users.aggregate([
{
$match: {
$and: [
{ UserName: { $eq: 'administrator' } },
{ 'Company.CompanyName': { $eq: 'test' } }
]
}
},
{
$lookup: {
from: "companies",
localField: "CompanyID",
foreignField: "CompanyID",
as: "Company"
}
},
])
Run Code Online (Sandbox Code Playgroud)
该$lookup部分代码工作的伟大.我得到了下一个结果:
但是,如果我添加$match代码,它什么也没带来.
我发现问题出现在第二场比赛中: { 'Company.CompanyName': { $eq: 'test' } }但是我无法意识到它有什么问题.有任何想法吗?
更新:
我也尝试$unwind了$lookup结果,但没有运气:
db.users.aggregate([
{
$match: {
$and: [
{ UserName: { $eq: 'administrator' } },
{ 'Company.CompanyName': { $eq: 'edt5' } }
]
}
},
{ unwind: '$Company' },
{
$lookup: {
from: 'companies',
localField: 'CompanyID',
foreignField: 'CompanyID',
as: 'Company'
}
},
])
Run Code Online (Sandbox Code Playgroud)
chr*_*dam 21
使用MongoDB 3.4,您可以运行使用$addFields管道和$filter运算符的聚合管道,仅返回Company具有与给定条件匹配的元素的数组.然后,您可以$filter使用$arrayElemAt运算符包装表达式以返回单个文档,该文档实质上$unwind通过展平数组来合并功能.
按照此示例来理解上述概念:
db.users.aggregate([
{ "$match": { "UserName": "administrator" } },
{
"$lookup": {
"from": 'companies',
"localField": 'CompanyID',
"foreignField": 'CompanyID',
"as": 'Company'
}
},
{
"$addFields": {
"Company": {
"$arrayElemAt": [
{
"$filter": {
"input": "$Company",
"as": "comp",
"cond": {
"$eq": [ "$$comp.CompanyName", "edt5" ]
}
}
}, 0
]
}
}
}
])
Run Code Online (Sandbox Code Playgroud)
以下答案适用于mongoDB 3.6或更高版本。
鉴于:
users与现场CompanyID和集合companies与现场CompanyID要查找Companies有关Users的匹配CompanyID,其中另外:
User.UserName等于administratorCompanyon User必须匹配条件:CompanyName等于edt5以下查询将为您工作:
db.users.aggregate([
{ $match: { UserName: 'administrator' } },
{
$lookup: {
from: 'companies',
as: 'Company',
let: { CompanyID: '$CompanyID' },
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ['$CompanyID', '$$CompanyID'] },
{ $eq: ['$CompanyName', 'edt5'] },
]
}
}
}
]
}
},
])
Run Code Online (Sandbox Code Playgroud)
说明: 这是执行条件比简单外部/本地字段相等匹配复杂的左联接查询的方法。
代替使用localField和foreignField,使用:
let 您可以在其中将本地字段映射到变量的选项,pipeline您可以在其中指定聚合的选项Array。在中,pipeline您可以使用$match带有的过滤器,$expr您可以在其中重复使用之前定义的变量let。
| 归档时间: |
|
| 查看次数: |
29099 次 |
| 最近记录: |