請教一個關於mongodb(mongoose)的問題,
一個博客,有兩張表,文章和tag,多對多關係,
文章表內有tag字段是一個數組,存儲著tag的id,查詢文章的時候可以關聯出每一個tag的數據,
現在的需求是:
查詢tag list的時候,需要同時得到每個tag分別被多少個文章包含著,即count,
除了遍歷和手動建立count字段增改時重新統計
是否還有更好的透過mongoose api實現的方法,感謝各位大神!
PHPz2017-05-02 09:26:37
解決了,需要聚合查詢,聚合前先分解,然後聚合,具體程式碼,其實本身聚合查詢可以查詢需求,但是需求是多對多資料關係,而非一對多,所以必須先分解為一對一關係
相關程式碼片段
相關參考文件
// 查询article-tag的count聚合数据
const getTagsCount = tags => {
let $match = {};
if (!authIsVerified(req)) {
$match = { state: 1, public: 1 };
}
Article.aggregate([
{ $match },
{ $unwind : "$tag" },
{ $group: {
_id: "$tag",
num_tutorial: { $sum : 1 }}
}
])
.then(counts => {
const newTags = tags.docs.map(t => {
const finded = counts.find(c => String(c._id) === String(t._id));
t.count = finded ? finded.num_tutorial : 0;
return t;
});
tags.docs = newTags;
querySuccess(tags);
})
.catch(err => {
querySuccess(tags);
})
};