2015-04-01 20 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