gpt4 book ai didi

MongoDB按数组内部元素分组

转载 作者:IT老高 更新时间:2023-10-28 11:03:59 25 4
gpt4 key购买 nike

我有一个文章列表,每个文章都有一个数组属性,其中列出了其中提到的各种个人:

_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"
]

我一直在尝试(未成功)根据过去 7 天内标记的文章数量获取所有艺术家个人 (class_artist) 的列表。

我已经做到了:

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 函数,但未能成功。

最佳答案

您使用的是什么框架?这不是 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 } }
])

如此高效:

  1. Filter按日期,因为您已经设置了过去 7 天的 var
  2. Project只有我们需要的字段{我们只需要一个! }
  3. Unwind数组,所以我们现在对每个文档中的每个数组元素都有一个记录
  4. Group扩展文档中关于艺术家的作品
  5. 项目成一种文档格式,您可以将其用作与 _id 混淆的组
  6. Sort结果以相反的顺序查看顶部标记的第一个

聚合的好处在于您可以逐步建立这些阶段以查看发生了什么。

根据需要摇动并烘焙到您自己的驱动程序实现或 ODM 框架中。

关于MongoDB按数组内部元素分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21509045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com