2015-04-01 106 views
2

我要过滤时AGG:6和 '值' 大于:1000和AGG:5和 '值' 大于:2000 架构:过帐MongoDB的-Moogose查询阵列字段进行过滤

Query:db.postings.find(
      { agg: { 
       $elemMatch: { 
        $and:[ 
        {agg:'5', value: { $gte: '2000'} }, 
        {agg:'6', value: { $gte: '1000'} } 
        ] 
        } 
       }} 
      ); 

结果:[]空

集“:

{ "_id":1, 
    "agg" : [ 
     { "value" : "2014", "agg" : "5"}, 
     {"value" : "2500","agg" : "6"} 
    ], 
} 
{ 
    _id:2, 
    "agg" : [ 
     { "value" : "2015", "agg" : "5"}, 
     { "value" : "1000","agg" : "6" } 
    ], 
} 

怎么我写查询correc TLY?

回答

1

它看起来像你想要的文件,其中agg阵列满足以下条件:

contains a subdocument where agg = "6" and value >= "2000" 
AND 
contains a subdocument where agg = "5" and value >= "1000" 

您所查询的是在agg子阵满足以下条件的文件:

0正确的查询
contains a subdocument where 
    agg = "6" and value >= "2000" 
    AND 
    agg = "5" and value >= "1000" 

MongoDB的配方

{ 
    "$and" : [ 
      { "agg" : { "$elemMatch" : { "agg" : "5", "value" : { "$gte" : "2000" } } } }, 
      { "agg" : { "$elemMatch" : { "agg" : "6", "value" : { "$gte" : "1000" } } } } 
     ] 
} 

等效地$all

{ 
    "agg" : { 
     "$all" : [ 
      { "$elemMatch" : { "agg" : "5", "value" : { "$gte" : "2000" } } }, 
      { "$elemMatch" : { "agg" : "6", "value" : { "$gte" : "1000" } } } 
     ] 
    } 
} 

这个查询两个文件相匹配,我想如预期。但是,我仍然怀疑你是在做你真正想做的事情 - 你确定要将agg.aggagg.value的值设为字符串而不是数字吗?

{ 
    "_id" : 3, 
    "agg" : [ 
     { "agg" : "5", "value" : "2015" }, 
     { "agg" : "6", "value" : "potato" } 
    ] 
} 

本文件并不:

{ 
    "_id" : 4, 
    "agg" : [ 
     { "agg" : "5", "value" : "2015" }, 
     { "agg" : "6", "value" : 2000 } 
    ] 
} 
例如,下面的文档匹配查询
0

您使用$and是什么让你感到困扰。 $and表示“我想要所有匹配的文档均为查询”。说我想要一个文档的值为“5”“6”对于agg这是没有意义的,这就是你所说的。

如果你想匹配查询任何文件的条件(这将匹配集合中的两个文件),你可以简单地改变$and$or