首页 文章

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

提问于
浏览
0

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

我试过了:

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

    这工作,谢谢你说frizi

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

  • 0

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

    [{ 
    _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'}
    

    unwind为Reviews数组中的每个元素创建了一个文档,其中包含元素本身和他的宿主文档 . 现在可以根据需要轻松地按照有用的方式进行分组 . 现在我们可以使用您编写的同一组,我们将获得结果 .

    在小组之后,我们的数据将如下所示:

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

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

    What's the $unwind operator in MongoDB?

相关问题