我对Mongo很新。
#1#
{
"_id" : NumberLong(3990025630833),
"TicId" : 1012849,
"OrgId" : 929
"Nms" : {
"Cmp" : "YourCorp AR",
"Org" : "YourCorp",
"Wkg" : "NGA_T1",
"Srv" : "Performance management"
},
}
#2#
{
"_id" : NumberLong(3990025630833),
"TicId" : 1012859,
"OrgId" : 929
"Nms" : {
"Cmp" : "YourCorp AR",
"Org" : "YourCorp",
"Wkg" : "NGA_T2_Compensation",
"Srv" : "Hire management"
},
}
#3#
{
"_id" : NumberLong(3990025630833),
"TicId" : 1012869,
"OrgId" : 929
"Nms" : {
"Cmp" : "YourCorp BE",
"Org" : "YourCorp",
"Wkg" : "NGA_T1",
"Srv" : "Finance"
},
}
我正在查询有两个Nms.Cmp
和Nms.Wkg
字段。
Cmp
是公司。 Wkg
是工作组。公司可以包含多个工作组。
用户可以是也可以不是公司的经理。
当用户是公司的经理时,我们不会进一步寻找工作组。当用户是公司的简单代理时,我们需要查找他有权访问的工作组。
例如:
$or:[
{$and:[
{'Nms.Cmp':{$eq:'YourCorp AR'}},
{'Nms.Wkg':{$in:[
'NGA_T2_Compensation',
'NGA_T2_Gatekeeper',
'NGA_T2_WorkforceAdmin']}}]},
{$and:[
{'Nms.Cmp':{$eq:'YourCorp BE'}}]},
{$and:[
{'Nms.Cmp':{$eq:'YourCorp CO'}}]}]
用户是'YourCorp BE'的经理,因此无需查看工作组列表。但是,用户只是“YourCorp AR”的代理,并且可以访问以下工作组:
'NGA_T2_Compensation','NGA_T2_Gatekeeper','NGA_T2_WorkforceAdmin'
因此,上面的查询摘录将返回结果项目#2和项目#3 。 项目#1不会返回。
有没有办法可以优化这个查询,以便更多地使用索引? $in
似乎至少部分地做了这个技巧,但是我们可以在$in
中使用多个字段,就像我们为SQL做的那样:例如:
select * from tickets
where (Cmp,Wkg) IN (('YourCorp AR','NGA_T2_Compensation'), ('YourCorp AR','NGA_T2_Gatekeeper'), ('YourCorp AR','NGA_T2_WorkforceAdmin'))
OR (Cmp) IN ('YourCorp BE','YourCorp CO')
谢谢