我有一个文章列表,每个文章都有一个数组属性,列出了其中提到的各个人:
_id: {
$oid: "52b632a9e4f2ba13c82ccd23"
},
providerName: "The Guardian",
url: "http://feeds.theguardian.com/c/34708/f/663860/s/3516cebc/sc/38/l/0L0Stheguardian0N0Cmusic0C20A130Cdec0C220Cwaterboys0Efishermans0Eblues0Etour0Ehammersmith/story01.htm",
subject: "The Waterboys – review",
class_artist: [
"paul mccartney"
]
我一直在尝试(未成功)获取所有个别艺术家(class_artist
)的列表,根据他们在过去7天内被标记的文章数量。
我已经达到了:
var date = new Date();
date.setDate(date.getDate() - 7);
db.articles.group({
key: { class_artist: 1 },
cond: { class_date: { $gt: date } },
reduce: function ( curr, result ) { result.cnt++; },
initial: { cnt : 0 }
}).sort({cnt: -1});
但不幸的是,它不会根据单个数组值计算它们,而是通过数组合成(即艺术家列表)来计算它们。
我尝试使用$unwind
功能,但无法使其正常工作。
答案 0 :(得分:106)
您使用的是哪种框架?这不是MongoDB shell,看起来像MapReduce周围的一些奇怪的包装器。在这种情况下,$unwind将无法使用,您需要aggregation framework中的用户使用它。这就是你想要的mongo shell:
db.articles.aggregate([
{$match: { class_date: { $gte: date } } },
{$project: { _id: 0, class_artist: 1 } },
{$unwind: "$class_artist" },
{$group: { _id: "$class_artist", tags: { $sum: 1 } }},
{$project: { _id: 0,class_artist: "$_id", tags: 1 } },
{$sort: { tags: -1 } }
])
如此高效: