通常不是您在單個操作中執行的操作,但如果這些操作確實是您唯一的字段並且沒有太多匹配的文檔,您可以執行此操作。
db.collection.aggregate([
{ "$group": {
"_id": "$article_id",
"docs": {
"$push": {
"user_id": "$user_id",
"article_id": "$article_id",
"score": "$score"
}
},
"votes": { "$sum": 1 }
}},
{ "$match": { "votes": { "$gt": 3 } } },
{ "$unwind": "$docs" },
{ "$project": {
"user_id": "$docs.user_id",
"article_id": "$docs.article_id",
"score": "$docs.score"
}}
])
可以清理一下有點用MongoDB的2.6和更高它提供了$$ROOT
在管道系統變量:
db.collection.aggregate([
{ "$group": {
"_id": "$article_id",
"docs": {
"$push": "$$ROOT"
},
"votes": { "$sum": 1 }
}},
{ "$match": { "votes": { "$gt": 3 } } },
{ "$unwind": "$docs" },
{ "$project": {
"user_id": "$docs.user_id",
"article_id": "$docs.article_id",
"score": "$docs.score"
}}
])
否則你可以接受你是在幾個步驟做這個並處理與返回「article_id的」值列表中的「數」大於三:
var ids = db.collection.aggregate([
{ "$group": {
"_id": "$article_id",
"votes": { "$sum": 1 }
}},
{ "$match": { "votes": { "$gt": 3 } } },
]).toArray().map(function(x){ return x._id });
db.collection.find({ "article_id": { "$in": ids } })
如果這是一個殼操作,那麼你會使用結果數組中的「結果」鍵在默認情況下在早期版本中返回到2.6。
你究竟在這裏問什麼?所有文章都有相同的「ID」。那麼你想要單個文件還是每件文章的總數少於三個? –
我想放棄投票的文章總共投票少於3票(3篇文章條目)的投票條目(文檔)(忽略投票分數,只是文檔條目總數 - 總票數)。那有意義嗎? – dolyth
沒有真正回答這個問題。這三份文件都是針對同一篇文章的。 「投票」字段的「總和」是否需要小於3才能顯示文檔或您的意思是什麼?如果你不清楚,我在這裏看到的答案是「投票」:{「$ gt」:3}'除非這基本上是你想要的。但看起來很基本。 –