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!
node.js mongodb mongoose
add a comment |
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!
node.js mongodb mongoose
1
Unclear what you are asking. Where isepisodes._idinPodcast? And you can simply use$sizeto count the number of elements inresultingEpisodeArray. Not sure why you used$grouphere?
– Anthony Winzlet
Nov 19 at 16:23
@AnthonyWinzlet, the _id is auto generated. I'll check your suggestions
– Valerio
Nov 20 at 9:07
add a comment |
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!
node.js mongodb mongoose
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
node.js mongodb mongoose
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 isepisodes._idinPodcast? And you can simply use$sizeto count the number of elements inresultingEpisodeArray. Not sure why you used$grouphere?
– Anthony Winzlet
Nov 19 at 16:23
@AnthonyWinzlet, the _id is auto generated. I'll check your suggestions
– Valerio
Nov 20 at 9:07
add a comment |
1
Unclear what you are asking. Where isepisodes._idinPodcast? And you can simply use$sizeto count the number of elements inresultingEpisodeArray. Not sure why you used$grouphere?
– 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
add a comment |
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!
add a comment |
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!
add a comment |
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!
add a comment |
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!
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!
answered Nov 20 at 9:25
Valerio
416519
416519
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
1
Unclear what you are asking. Where is
episodes._idinPodcast? And you can simply use$sizeto count the number of elements inresultingEpisodeArray. Not sure why you used$grouphere?– Anthony Winzlet
Nov 19 at 16:23
@AnthonyWinzlet, the _id is auto generated. I'll check your suggestions
– Valerio
Nov 20 at 9:07