2017-10-12 25 views
0

嘗試構建一個聚合查詢,以便我可以對郵編進行分類並返回每個組的計數。如果郵編包含數組中的值,則將郵編組編碼爲新類別

的docuement看起來部分像

{ 
"_id" : ObjectId("value"), 
"updatedAt" : ISODate("value"), 
"zip" : "11209", 
"state" : "NY", 
"city" : "New York", 
} 

我想組由「拉鍊」字段與相互排斥的值

east_ny_zipcodes = [11209, 11210, 11211, ...] 
lower_ny_zipcodes = [11212, 11213, 11214, ...] 

理想地返回類似的n個比較的陣列

{ 
lower_ny: 1200, 
upper_ny: 1500, 
east_ny: 2000 
} 
+1

您可以使用'$ group'和'$ cond'並比較每個類別在它自己的cond中的數組。像'db.collection_name.aggregate({ 「$組」:{ 「_id」:空, 「east_ny」:{ 「$總和」:{ 「$ COND」:在[ { 「$ 「:[ 「$拉鍊」, 「east_ny_zipcodes」 ] }, 1,] } } } })'。你可以用'$或'添加'$ match'階段來限制在管道中處理的郵政編碼。 – Veeram

回答

1

從3.4開始,使用MongoDB,您可以使用$in得到一個比較數組:

db.zips.aggregate([ 
    { "$group": { 
    "_id": null, 
    "lower_ny": { 
     "$sum": { 
     "$cond": [{ "$in": [ "$zip", lower_ny_zipcodes ] },1,0] 
     } 
    }, 
    "east_ny": { 
     "$sum": { 
     "$cond": [{ "$in": [ "$zip", east_ny_zipcodes ] },1,0] 
     } 
    }, 
    "upper_ny": { 
     "$sum": { 
     "$cond": [{ "$in": [ "$zip", upper_ny_zipcodes ] },1,0] 
     } 
    } 
    }} 
]) 

如果你沒有那麼再有就是因爲MongoDB的2.6 $setIsSubset。語法和意圖略有不同。但是,你的列表是「獨一無二」的,所以它不是一個問題:

db.zips.aggregate([ 
    { "$group": { 
    "_id": null, 
    "lower_ny": { 
     "$sum": { 
     "$cond": [{ "$setIsSubset": [ ["$zip"], lower_ny_zipcodes ] },1,0] 
     } 
    }, 
    "east_ny": { 
     "$sum": { 
     "$cond": [{ "$setIsSubset": [ ["$zip"], east_ny_zipcodes ] },1,0] 
     } 
    }, 
    "upper_ny": { 
     "$sum": { 
     "$cond": [{ "$setIsSubset": [ ["$zip"], upper_ny_zipcodes ] },1,0] 
     } 
    } 
    }} 
]) 

它在本質上只是爲了你的外部定義的數組內容,其中獲取發送作爲操作BSON內容擴展邏輯比較。

當然,您的數組中的值也必須是「字符串」才能匹配。但是,如果您還沒有完成,那很容易:

east_ny_zipcodes = [11209, 11210, 11211, ...].map(n => n.toString()); 
+0

是否有可能讓它返回每個類別的計數,還有像正常的$ eq查詢那樣的分組項目列表。想要做一次抽查以確保它是正確的。 謝謝!我正在使用$ in操作符,但沒有先使用$ cond。感謝您的澄清。 –

+0

@MeirSnyder你似乎在尋找['$ push'](https://docs.mongodb.com/manual/reference/operator/aggregation/push/),這是另一個累加器,它可以從與分組邊界匹配的項目。請注意,16MB限制仍然適用,因此如果您正在構建包含數組內容的分組文檔,從而違反了該規則,則會出錯。或者'$ in'只是返回一個布爾值,所以你可以總是使用'$ project'或'$ addFields'來進行布爾評估,而不需要任何分組。 –