复杂逻辑查询简单的mongo文档

时间:2012-05-21 16:07:09

标签: mongodb mapreduce

我正在与mongo中非常基本的数据类型形成复杂的逻辑查询。基本上我可以有数百万的用户属性,所以我的基本mongo文档是:

{
   name: "Gender"
   value: "Male"
   userId : "ABC123"
}

{
   name: "M-Spike"
   value: 0.123
   userId : "ABC123"
}

我想要做的是搜索findAll userId等{name:“Gender,value:”Male“}和{name:”m-spike“,value:{$ gt:0.1}}

我尝试过使用聚合框架,但查询的复杂性有限,基本上我是ORing所有标准并通过sampleId计算结果(复制了一个基本的AND)

1 个答案:

答案 0 :(得分:0)

我可以看到一种方法,N是要查询的属性数(在您的示例中N为2)。尝试这样的事情:

 db.collection.aggregate(
      [  {  $match:  {$or: [ 
                        {"name":"M-Spike","value":{$gt:.1}},
                        {"name":"Gender","value":"Male"}
                           ] 
                     } 
         },   
         {  $group: { _id:"$userId",total:{$sum:1}}  
         },
         { $project: { _id:1, 
                       matchedAttr : { $eq: ["$total",2] }   
                     } 
         }
      ]
 )

你会回来的:

{
    "result" : [
        {
            "_id" : "XYZ123",
            "matchedAttr" : false
        },
        {
            "_id" : "ABC123",
            "matchedAttr" : true
        }
    ],
    "ok" : 1
}

现在,如果您有2个条件通过“$或”进行匹配,那么对于匹配它们的_id,您将返回true。因此,对于五个条件,$ match:$或数组将有五个条件对,最后一个$ project转换将为$eq: ["$total",5]

内置于此解决方案的假设是您不能有重复的条目(即_id不能有“M-Spike”:。5以及“M-Spike”:。2。如果可以,那么这不会工作