MongoDB聚合数组的子字段(Array是主字段)

时间:2018-12-08 22:12:23

标签: mongodb mongodb-query

我在MongoDB中有一个数据库。主要有三个字段:_id,评论,HotelInfo。评论和HotelInfo是数组。评论有一个称为作者的字段。我想打印出每个作者姓名(一次)及其在数据集中出现的次数。

我尝试过:

db.reviews.aggregate({$ group:{_id:'$ Reviews.Author',count:{$ sum:1}}}).pretty()

部分结果是:

“ _ id”:[         “ VijGuy”,         “ Stephtastic”,         “ dakota431”,         “ luce_sociator”,         “ ArkansasMomOf3”,         “ ccslilqt6969”,         “ RJeanM”,         “ MissDusty”,         “ sammymd”,         “ TripAdvisor会员”,         “ TripAdvisor会员”     ],     “计数”:1

应该如何:

{“ _id”:“ VijGuy”,“ count”:1},{“ _id”:“ Stephtastic”,“ count”:1}

我在下面发布了JSON格式。

任何有关如何执行此操作的想法将不胜感激

JSON Format

2 个答案:

答案 0 :(得分:1)

让我们假设这是我们的收藏。

[{ 
_id: 1, 
Reviews: [{Author: 'elad' , txt: 'good'}, {Author: 'chen', txt: 'bad'}]
},
{
_id: 2,
Reviews: [{Author: 'elad', txt : 'nice'}]
}]

要获取所需的数据,我们需要首先使用展开阶段,然后使用组阶段。

[{ $unwind: '$Reviews' }, {$group : { _id : '$Reviews.Author', count : {$sum : 1}}}]

您需要先在“评论”字段中展开收藏集。 展开阶段之后,管道中的数据将如下所示。

{_id:1, Reviews: {Author: 'elad' , txt: 'good'}},
{_id:1, Reviews: {Author: 'chen' , txt: 'bad'}},
{_id:2, Revies:  {Author: 'elad', txt : 'nice'}

展开操作使用元素本身及其宿主文档为Reviews数组中的每个元素创建了一个文档。现在,可以根据需要轻松以有用的方式进行分组。现在,我们可以使用您编写的相同组,我们将获得结果。

分组后,我们的数据将如下所示:

[{_id: 'elad',sum:2},{_id: 'chen', sum: 1}]

展开是聚合框架中非常重要的管道阶段。它帮助我们将复杂且嵌套的文档转换为平面文档和简单文档,并帮助我们以不同方式查询数据。

What's the $unwind operator in MongoDB?

答案 1 :(得分:0)

这很奏效,谢谢弗拉兹·弗里齐

db.reviews.aggregate({$ unwind:'$ Reviews'},{$ group:{_id:'$ Reviews.Author',count:{$ sum:1}}})。pretty()