mongo如何在多个字段中使用$ in

时间:2015-06-12 17:01:05

标签: mongodb

我对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.CmpNms.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')

谢谢

0 个答案:

没有答案