2017-10-16 171 views
0

我見過類似的問題,但對於像我這樣的新手來說,這很複雜。再加上沒有答案提供了語法分解。聚合使用項目和切片,mongodb

我的數據庫:

name :"Kim" 
    points: [ 
     { category:"Purchase", 
     points: -50}, 
     { category: "Wage", 
     points : 275}, 
     { category: "Purchase", 
     points: -40} 
    ] 

    name :"Meghan" 
    points: [ 
     { category:"Contest", 
     points: 130}, 
     { category: "Purchase", 
     points : -25}, 
     { category: "Games", 
     points : 50} 
    ] 
    ] 

所以在蒙戈外殼我試圖得到它找到每一個等於「購買」,但只返回給我的最後一個points.category。我試圖通過使用聚合,$ project和$ slice來實現這一點。我的問題是,我不明白這個語法足以知道$ slice是在$ project內還是在外面用逗號分隔。我明白當我自己使用$ project或者使用$ slice時的語法,但是我不知道如何將所有這些東西一起使用到一些神奇的東西。如果有人能幫我解決我的問題,並解釋如何將所有這些事情妥善地結合在一起,我會永遠感激不盡。我已經閱讀了文檔,但沒有告訴我如何一次使用所有內容。

我想搜索名字是Kim的學生點,找到她最後一次購買。我想要的結果是 [{points:-40}]

+0

你缺少的部分是你需要['$ filter'(https://docs.mongodb.com/manual/reference/operator/aggregation/filter/)數組內容'「購買「**之前**你申請'$切片'或甚至['arrayElemAt'](https://docs.mongodb.com/manual/reference/operator/aggregation/arrayElemAt/)爲了得到* *最後**元素。所以'$ filter'只返回這些元素的數組。用'$ slice'和'-1'對該索引包裝該索引以返回該「已過濾」數組中的「最後一個」。 –

+0

請參閱[僅檢索MongoDB集合中對象數組中的查詢元素](https://stackoverflow.com/q/3985214/2313887),以瞭解鏈接文檔以外的'$ filter'的示例用法。 –

+0

好吧,我想出了這個:'db.students.aggregate([{$ project:{points:{$ filter:{input:「$ points」,as:「pts」,cond:{$ eq:[「$ $ pts.category「,」Purchase「]}}}}}])。pretty()'問題是它返回每個學生的購買。我如何讓它只返回金錢,我在哪裏放置切片只得到最後一次購買。 –

回答

0

如果您可以在其他聚合運算符上使用更多投影,則可以嘗試此操作。

db.students.aggregate([ 
{ $match : { name : "Kim" } }, 
{ $project: 
    { 
     points: { 
      $filter : { input: "$points", as:"pts", cond: {$eq: ["$$pts.category", "Purchase"]} } 
      } 
    } 
}, 
{ $project: 
    { 
     _id : 0, 
     points: { $arrayElemAt: [{$slice: [ "$points.points", -1]},0] } 
    } 
} 
]) 
+0

感謝Hydro,我只使用了代碼的頂部,而不是第二個投影,它的工作完美無瑕。謝謝大家的全力幫助 –

+0

第一個投影會給出「Kim所有購買點數」的結果,第二個投影會給出「Kim最後一個購買點數」的結果。 –