我有下一个mongo代码:
db.users.aggregate([
{
$match: {
$and: [
{ UserName: { $eq: 'administrator' } },
{ 'Company.CompanyName': { $eq: 'test' } }
]
}
},
{
$lookup: {
from: "companies",
localField: "CompanyID",
foreignField: "CompanyID",
as: "Company"
}
},
])
代码的$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'
}
},
])
答案 0 :(得分:18)
使用MongoDB 3.4,您可以运行使用 $addFields
管道和 $filter
运算符的聚合管道,仅返回{{ 1}}数组,其元素与给定条件匹配。然后,您可以使用 $filter
运算符包装 $arrayElemAt
表达式,以返回单个文档,该文档实质上包含 {{3}通过展平数组来实现功能。
按照此示例来理解上述概念:
Company
答案 1 :(得分:0)
以下答案适用于mongoDB 3.6或更高版本。
鉴于:
users
的集合CompanyID
和一个具有companies
字段的CompanyID
集合您要通过匹配Companies
在Users
上查找CompanyID
,其中:
User.UserName
等于administrator
Company
上的每个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'] },
]
}
}
}
]
}
},
])
说明: 这是执行条件比简单的外部/本地字段相等匹配复杂的左联接查询的方法。
您使用:
代替使用localField
和foreignField
let
选项,您可以在其中将本地字段映射到变量,pipeline
选项,您可以在其中指定聚合Array
。在pipeline
中,您可以将$match
过滤器与$expr
一起使用,在这里您可以重用先前在let
中定义的变量。
答案 2 :(得分:0)
这是在查找中拟合数组的代码。
while IFS=$' \t\n\r' read -r LINE