Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 简单mongo文档的复杂逻辑要求_Mongodb_Mapreduce - Fatal编程技术网

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

Mongodb 简单mongo文档的复杂逻辑要求,mongodb,mapreduce,Mongodb,Mapreduce,我正在努力在mongo中对非常基本的数据类型形成复杂的逻辑查询。基本上,我可以拥有数百万个用户属性,因此我的基本mongo文档是: { name: "Gender" value: "Male" userId : "ABC123" } { name: "M-Spike" value: 0.123 userId : "ABC123" } 我想做的是搜索像findAll userId这样的东西,其中{name:“Gender,value:“Male”}和{nam

我正在努力在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}


我尝试过使用聚合框架,但查询的复杂性是有限的,基本上我是对所有条件进行排序,并按sampleId(它复制了一个基本的和)计算结果。

我可以找到一种方法,因为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
}
现在,如果您有两个通过“$或”匹配的条件,那么对于匹配这两个条件的_id,您将返回true。因此,对于五个条件,$match:$或数组将有五个条件对,最后的$project转换将是
$eq:[“$total”,5]


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

我可以找到一种方法,因为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
}
现在,如果您有两个通过“$或”匹配的条件,那么对于匹配这两个条件的_id,您将返回true。因此,对于五个条件,$match:$或数组将有五个条件对,最后的$project转换将是
$eq:[“$total”,5]



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

您使用的是2.1版本和新的聚合框架吗?是的,我已经开始使用它,但并没有真正得到我想要的@asyakamsky我对您的模式结构感到惊讶-除非每个用户都可以拥有数千个属性,否则我认为拥有一个应用程序的所有属性更自然一个文档中的le用户…您知道用户将拥有的所有属性名称吗?如果是这样,那么可以使用聚合框架来实现这一点。用户可能拥有数百万个属性,我正在使用它来存储基因组数据,因此可能有一个临床参数的属性,通常在100到geno之间mic数据可以用来描述你基因组中数百万个变异中的每一个。通常我不会事先知道这些属性的名称,因为应该可以添加新的属性。你在使用2.1版本和新的聚合框架吗?是的,我已经开始使用它,但没有真正得到我想要的@AsyaKamskyI'm对您的模式结构感到惊讶-除非每个用户都可以拥有数千个属性,否则我认为在一个文档中拥有单个用户的所有属性更为自然…您知道用户将拥有的所有属性名称吗?如果是这样的话,可以使用聚合框架来实现这一点,一个用户可能拥有数百万个属性关于属性,我用它来存储基因组数据,因此可能会有一个临床参数的属性,通常在100的范围内,然后是基因组数据,它可能有点来描述你基因组中数百万个变异中的每一个。通常我不会预先知道属性的名称,因为在添加新的onesYea到目前为止,我有一些与此几乎相同的东西。这有效地产生了一个逻辑,我不相信如果你想与OR结合使用,它是正确的。例如OR(AND(“name”:“M-Spike”,“value”:{$gt:.1},{“name”:“Gender”,“value”:“Male”}),{“name”:“KRAS”,“value”:{$gt:12.4})你见过这样的模式吗?你认为这是一个合理的方法吗?它似乎不是一个灵活查询的合理模式。究竟“或”是什么查询是什么样的?如果它具有所有这些属性或所有属性?……这个查询是基于各种属性来选择患者组的。ith nameofattribute:value数组,如果可能的话,因为这将允许以多种方式进行查询。但可能会有一些折衷。是的,到目前为止,我有一些与此几乎相同的东西。这有效地产生了一个逻辑,我不相信它适用于与OR结合使用的情况。例如OR(AND)(“name”):“M-Spike”,“value”:{$gt:.1},{“name”:“Gender”,“value”:“Male”},{“name”:“KRAS”,“value”:{$gt:12.4})您见过这样的模式吗?您认为这是一种合理的方法吗?它似乎不是灵活查询的合理模式。“or”到底会是什么查询是什么样的?如果它具有所有这些属性或所有属性?……这个查询是基于各种属性来选择患者组的。ith nameofattribute:value数组,如果可能的话,因为这将允许以多种方式进行查询。但这可能需要权衡。