Mongoose $lookup count references











up vote
0
down vote

favorite












Here's my simplified schema for my MongoDB database that I'm working on:



const podcastSchema: Schema = new Schema({
name: { type: String, required: true },
episodes: {
type: [{
title: { type: String, required: true },
}],
default: undefined
}
},{
timestamps: true
});


I've added a schema for stats, basically a listen count for each episode of the podcast:



const statisticSchema: Schema = new Schema({
connectionIdentifier: { type: String, required: true },
episode: { type: Schema.Types.ObjectId, ref: 'Podcast.Episodes' }
},{
timestamps: true
});


Now I need to join (left outer join actually) for each episode in podcast the count of items in stats, so I can have something like this:



podcasts: {
name: 'Lorem'
episodes: [{
title: 'Ipsum',
played: 323
},{
title: 'Dolor',
played: 12
},
...
]
}


This is what I came from:



const episodes = await Podcast.aggregate([
{ $match: { _id: podcastId } }, {
$lookup: {
from: 'statistics',
localField: 'episodes._id',
foreignField: 'episode',
as: 'resultingEpisodeArray'
}
},{
$unwind: { path: '$resultingEpisodeArray', preserveNullAndEmptyArrays: true }
},{
$group: {
_id: null,
episode: { $push: '$episodes' },
played: { $sum: 1 }
}
},{
$project: {
_id: '$episode._id',
title: '$episode.
played: '$played'
}
}
]);


But it aggregate all podcast in a single one.
Where I'm failing?



Thanks for the help!










share|improve this question




















  • 1




    Unclear what you are asking. Where is episodes._id in Podcast? And you can simply use $size to count the number of elements in resultingEpisodeArray. Not sure why you used $group here?
    – Anthony Winzlet
    Nov 19 at 16:23












  • @AnthonyWinzlet, the _id is auto generated. I'll check your suggestions
    – Valerio
    Nov 20 at 9:07















up vote
0
down vote

favorite












Here's my simplified schema for my MongoDB database that I'm working on:



const podcastSchema: Schema = new Schema({
name: { type: String, required: true },
episodes: {
type: [{
title: { type: String, required: true },
}],
default: undefined
}
},{
timestamps: true
});


I've added a schema for stats, basically a listen count for each episode of the podcast:



const statisticSchema: Schema = new Schema({
connectionIdentifier: { type: String, required: true },
episode: { type: Schema.Types.ObjectId, ref: 'Podcast.Episodes' }
},{
timestamps: true
});


Now I need to join (left outer join actually) for each episode in podcast the count of items in stats, so I can have something like this:



podcasts: {
name: 'Lorem'
episodes: [{
title: 'Ipsum',
played: 323
},{
title: 'Dolor',
played: 12
},
...
]
}


This is what I came from:



const episodes = await Podcast.aggregate([
{ $match: { _id: podcastId } }, {
$lookup: {
from: 'statistics',
localField: 'episodes._id',
foreignField: 'episode',
as: 'resultingEpisodeArray'
}
},{
$unwind: { path: '$resultingEpisodeArray', preserveNullAndEmptyArrays: true }
},{
$group: {
_id: null,
episode: { $push: '$episodes' },
played: { $sum: 1 }
}
},{
$project: {
_id: '$episode._id',
title: '$episode.
played: '$played'
}
}
]);


But it aggregate all podcast in a single one.
Where I'm failing?



Thanks for the help!










share|improve this question




















  • 1




    Unclear what you are asking. Where is episodes._id in Podcast? And you can simply use $size to count the number of elements in resultingEpisodeArray. Not sure why you used $group here?
    – Anthony Winzlet
    Nov 19 at 16:23












  • @AnthonyWinzlet, the _id is auto generated. I'll check your suggestions
    – Valerio
    Nov 20 at 9:07













up vote
0
down vote

favorite









up vote
0
down vote

favorite











Here's my simplified schema for my MongoDB database that I'm working on:



const podcastSchema: Schema = new Schema({
name: { type: String, required: true },
episodes: {
type: [{
title: { type: String, required: true },
}],
default: undefined
}
},{
timestamps: true
});


I've added a schema for stats, basically a listen count for each episode of the podcast:



const statisticSchema: Schema = new Schema({
connectionIdentifier: { type: String, required: true },
episode: { type: Schema.Types.ObjectId, ref: 'Podcast.Episodes' }
},{
timestamps: true
});


Now I need to join (left outer join actually) for each episode in podcast the count of items in stats, so I can have something like this:



podcasts: {
name: 'Lorem'
episodes: [{
title: 'Ipsum',
played: 323
},{
title: 'Dolor',
played: 12
},
...
]
}


This is what I came from:



const episodes = await Podcast.aggregate([
{ $match: { _id: podcastId } }, {
$lookup: {
from: 'statistics',
localField: 'episodes._id',
foreignField: 'episode',
as: 'resultingEpisodeArray'
}
},{
$unwind: { path: '$resultingEpisodeArray', preserveNullAndEmptyArrays: true }
},{
$group: {
_id: null,
episode: { $push: '$episodes' },
played: { $sum: 1 }
}
},{
$project: {
_id: '$episode._id',
title: '$episode.
played: '$played'
}
}
]);


But it aggregate all podcast in a single one.
Where I'm failing?



Thanks for the help!










share|improve this question















Here's my simplified schema for my MongoDB database that I'm working on:



const podcastSchema: Schema = new Schema({
name: { type: String, required: true },
episodes: {
type: [{
title: { type: String, required: true },
}],
default: undefined
}
},{
timestamps: true
});


I've added a schema for stats, basically a listen count for each episode of the podcast:



const statisticSchema: Schema = new Schema({
connectionIdentifier: { type: String, required: true },
episode: { type: Schema.Types.ObjectId, ref: 'Podcast.Episodes' }
},{
timestamps: true
});


Now I need to join (left outer join actually) for each episode in podcast the count of items in stats, so I can have something like this:



podcasts: {
name: 'Lorem'
episodes: [{
title: 'Ipsum',
played: 323
},{
title: 'Dolor',
played: 12
},
...
]
}


This is what I came from:



const episodes = await Podcast.aggregate([
{ $match: { _id: podcastId } }, {
$lookup: {
from: 'statistics',
localField: 'episodes._id',
foreignField: 'episode',
as: 'resultingEpisodeArray'
}
},{
$unwind: { path: '$resultingEpisodeArray', preserveNullAndEmptyArrays: true }
},{
$group: {
_id: null,
episode: { $push: '$episodes' },
played: { $sum: 1 }
}
},{
$project: {
_id: '$episode._id',
title: '$episode.
played: '$played'
}
}
]);


But it aggregate all podcast in a single one.
Where I'm failing?



Thanks for the help!







node.js mongodb mongoose






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 19 at 19:59









kit

1,1081516




1,1081516










asked Nov 19 at 16:13









Valerio

416519




416519








  • 1




    Unclear what you are asking. Where is episodes._id in Podcast? And you can simply use $size to count the number of elements in resultingEpisodeArray. Not sure why you used $group here?
    – Anthony Winzlet
    Nov 19 at 16:23












  • @AnthonyWinzlet, the _id is auto generated. I'll check your suggestions
    – Valerio
    Nov 20 at 9:07














  • 1




    Unclear what you are asking. Where is episodes._id in Podcast? And you can simply use $size to count the number of elements in resultingEpisodeArray. Not sure why you used $group here?
    – Anthony Winzlet
    Nov 19 at 16:23












  • @AnthonyWinzlet, the _id is auto generated. I'll check your suggestions
    – Valerio
    Nov 20 at 9:07








1




1




Unclear what you are asking. Where is episodes._id in Podcast? And you can simply use $size to count the number of elements in resultingEpisodeArray. Not sure why you used $group here?
– Anthony Winzlet
Nov 19 at 16:23






Unclear what you are asking. Where is episodes._id in Podcast? And you can simply use $size to count the number of elements in resultingEpisodeArray. Not sure why you used $group here?
– Anthony Winzlet
Nov 19 at 16:23














@AnthonyWinzlet, the _id is auto generated. I'll check your suggestions
– Valerio
Nov 20 at 9:07




@AnthonyWinzlet, the _id is auto generated. I'll check your suggestions
– Valerio
Nov 20 at 9:07












1 Answer
1






active

oldest

votes

















up vote
0
down vote



accepted










Thanks to @AnthonyWinzlet suggestion, I got my errors. I really, really need to forget SQL when working on mongo.
For the sake of knowledge, here's the modified code that solved my issue:



const episodes = await Podcast.aggregate([
{ $match: { _id: podcastId } },
{ $unwind: '$episodes' },
{
$lookup: {
from: 'statistics',
localField: 'episodes._id',
foreignField: 'episode',
as: 'resultingEpisodeArray'
}
},
{
$project: {
_id: '$episodes._id',
title: '$episodes.title',
played: { $size: '$resultingEpisodeArray' }
}
},
]);


Again, kudos to Anthony for pointing me to the right direction!






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53378679%2fmongoose-lookup-count-references%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    0
    down vote



    accepted










    Thanks to @AnthonyWinzlet suggestion, I got my errors. I really, really need to forget SQL when working on mongo.
    For the sake of knowledge, here's the modified code that solved my issue:



    const episodes = await Podcast.aggregate([
    { $match: { _id: podcastId } },
    { $unwind: '$episodes' },
    {
    $lookup: {
    from: 'statistics',
    localField: 'episodes._id',
    foreignField: 'episode',
    as: 'resultingEpisodeArray'
    }
    },
    {
    $project: {
    _id: '$episodes._id',
    title: '$episodes.title',
    played: { $size: '$resultingEpisodeArray' }
    }
    },
    ]);


    Again, kudos to Anthony for pointing me to the right direction!






    share|improve this answer

























      up vote
      0
      down vote



      accepted










      Thanks to @AnthonyWinzlet suggestion, I got my errors. I really, really need to forget SQL when working on mongo.
      For the sake of knowledge, here's the modified code that solved my issue:



      const episodes = await Podcast.aggregate([
      { $match: { _id: podcastId } },
      { $unwind: '$episodes' },
      {
      $lookup: {
      from: 'statistics',
      localField: 'episodes._id',
      foreignField: 'episode',
      as: 'resultingEpisodeArray'
      }
      },
      {
      $project: {
      _id: '$episodes._id',
      title: '$episodes.title',
      played: { $size: '$resultingEpisodeArray' }
      }
      },
      ]);


      Again, kudos to Anthony for pointing me to the right direction!






      share|improve this answer























        up vote
        0
        down vote



        accepted







        up vote
        0
        down vote



        accepted






        Thanks to @AnthonyWinzlet suggestion, I got my errors. I really, really need to forget SQL when working on mongo.
        For the sake of knowledge, here's the modified code that solved my issue:



        const episodes = await Podcast.aggregate([
        { $match: { _id: podcastId } },
        { $unwind: '$episodes' },
        {
        $lookup: {
        from: 'statistics',
        localField: 'episodes._id',
        foreignField: 'episode',
        as: 'resultingEpisodeArray'
        }
        },
        {
        $project: {
        _id: '$episodes._id',
        title: '$episodes.title',
        played: { $size: '$resultingEpisodeArray' }
        }
        },
        ]);


        Again, kudos to Anthony for pointing me to the right direction!






        share|improve this answer












        Thanks to @AnthonyWinzlet suggestion, I got my errors. I really, really need to forget SQL when working on mongo.
        For the sake of knowledge, here's the modified code that solved my issue:



        const episodes = await Podcast.aggregate([
        { $match: { _id: podcastId } },
        { $unwind: '$episodes' },
        {
        $lookup: {
        from: 'statistics',
        localField: 'episodes._id',
        foreignField: 'episode',
        as: 'resultingEpisodeArray'
        }
        },
        {
        $project: {
        _id: '$episodes._id',
        title: '$episodes.title',
        played: { $size: '$resultingEpisodeArray' }
        }
        },
        ]);


        Again, kudos to Anthony for pointing me to the right direction!







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 20 at 9:25









        Valerio

        416519




        416519






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53378679%2fmongoose-lookup-count-references%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Ottavio Pratesi

            Tricia Helfer

            15 giugno