复杂的逻辑要求在简单的mongo文档上



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

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

我想做的是搜索像 findAll userId 这样的东西,其中 {name : "性别, 值: "男性"} 和 { name : "m-spike", value : { $gt : 0.1} }

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

我可以看到一种方法,因为 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 个通过"$or"匹配的条件,那么您将得到与两个条件匹配_id。 因此,对于五个条件,您的$match:$or数组将有五个条件对,最后一个$project转换将$eq: ["$total",5]

此解决方案内置的假设是,您不能有重复的条目(即_id不能有"M-Spike":.5和"M-Spike":.2。 如果可以,那么这将不起作用。

相关内容

  • 没有找到相关文章

最新更新