I'm having a lot of difficult to get solve this mongodb (mongoose) problem.
我很难解决这个mongodb(猫鼬)问题。
There is schema Guess
(_id
, title
, tags
) with tags
is array of tags_id ( was referenced from Tag
schema ).
模式Guess(_id,title,tags)带有标签是tags_id数组(从Tag模式引用)。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var schema = mongoose.Schema({
title: {
type: Schema.Types.Mixed,
required: true
},
tags: [{
type: Schema.Types.ObjectId,
ref: 'Tag',
required: false,
default: []
}]
});
schema.index({ '$**': 'text' });
module.exports = mongoose.model('Guess', schema);
document example :
文档示例:
{
"_id" : ObjectId("578857529507cafd5fe1f9b3"),
"title" : {
"en" : "Will Amazon start its first drone deliveries this year?"
},
"tags" : [
ObjectId("578857529507cafd5fe1f9b7"),
ObjectId("578857529507cafd5fe1f9b6")
]
}
{
"_id" : ObjectId("578857a59507cafd5fe1f9bb"),
"title" : {
"en" : "Will Singapore 3D print homes during 2016?"
},
"tags" : [
ObjectId("578857a59507cafd5fe1f9bf"),
ObjectId("578857529507cafd5fe1f9b6")
]
}
......
.....
I need to get list of most popular tag (tags). Above I show you the schema and my solution mongoose query.
我需要获得最流行的标签(标签)列表。上面我向您展示了架构和我的解决方案mongoose查询。
Guess.aggregate([
{
"$project": {
"_id": 1,
"tags": 1
}
},
{
"$unwind": "$tags"
}
// ,
// {
// "$group": {
// "tags": '$tags.tags',
// "count": {"$sum": 1}
// }
// },
// {"$sort": {"count": -1}},
// {"$limit": 5}
], function (error, result) {
//
});
if I comment this option
如果我评论这个选项
{
"$group": {
"tags": '$tags.tags',
"count": {"$sum": 1}
}
},
{"$sort": {"count": -1}},
{"$limit": 5}
Then my result of query is
然后我的查询结果是
[ { _id: 578857529507cafd5fe1f9b3,
tags: 578857529507cafd5fe1f9b7 },
{ _id: 578857529507cafd5fe1f9b3,
tags: 578857529507cafd5fe1f9b6 },
{ _id: 578857a59507cafd5fe1f9bb,
tags: 578857a59507cafd5fe1f9bf },
{ _id: 578857a59507cafd5fe1f9bb,
tags: 578857a59507cafd5fe1f9be },
{ _id: 578857d637cc983f60774fcb,
tags: 578857d637cc983f60774fcf },
{ _id: 578857d637cc983f60774fcb,
tags: 578857d637cc983f60774fce },
{ _id: 578f2cbe875ec80f11e49a66,
tags: 578f2cbe875ec80f11e49a6a },
{ _id: 578f2e25b470bb62115f1741,
tags: 578f2e25b470bb62115f1745 },
{ _id: 578f2f119cd9848c1180be8b,
tags: 578f2f119cd9848c1180be8f },
{ _id: 578f2f119cd9848c1180be8b,
tags: 578f2f119cd9848c1180be8e },
{ _id: 578f50876a3ba88d13aed982,
tags: 578f50876a3ba88d13aed986 },
{ _id: 578f50876a3ba88d13aed982,
tags: 578f50876a3ba88d13aed985 },
{ _id: 578f510c6a3ba88d13aed989,
tags: 578f510c6a3ba88d13aed98c },
{ _id: 578f510c6a3ba88d13aed989,
tags: 578f510c6a3ba88d13aed98d } ]
I uncomment then this query error. I want group tag
and display 5 most popular tags. How to fix it?
我取消注释这个查询错误。我想要组标签并显示5个最受欢迎的标签。怎么解决?
The result that I want looks like
我想要的结果看起来像
[ { tags: 578857529507cafd5fe1f9b6, count: 10 },
{ tags: 578857529507cafd5fe1f9b7, count: 9 },
{ tags: 578854779507cafd5fe1f9a6, count: 8 },
{ tags: 578854779507cafd5fe1f9a5, count: 5 },
{ tags: 5788570d9507cafd5fe1f9b0, count: 2 } ]
1 个解决方案
#1
6
In your $group
stage you need to specify an _id
. It's mandatory and will be the group by key. So basically you need to change:
在$ group阶段,您需要指定一个_id。它是强制性的,将成为按键分组。所以基本上你需要改变:
{
"$group": {
"tags": '$tags.tags',
"count": {"$sum": 1}
}
}
to:
{
"$group": {
"_id": '$tags',
"count": {"$sum": 1}
}
}
So the complete pipeline would be:
所以完整的管道将是:
Guess.aggregate([
{
"$project": {
"_id": 1,
"tags": 1
}
},
{
"$unwind": "$tags"
}
,
{
"$group": {
"_id": '$tags',
"count": {"$sum": 1}
}
},
{"$sort": {"count": -1}},
{"$limit": 5}
]);
#1
6
In your $group
stage you need to specify an _id
. It's mandatory and will be the group by key. So basically you need to change:
在$ group阶段,您需要指定一个_id。它是强制性的,将成为按键分组。所以基本上你需要改变:
{
"$group": {
"tags": '$tags.tags',
"count": {"$sum": 1}
}
}
to:
{
"$group": {
"_id": '$tags',
"count": {"$sum": 1}
}
}
So the complete pipeline would be:
所以完整的管道将是:
Guess.aggregate([
{
"$project": {
"_id": 1,
"tags": 1
}
},
{
"$unwind": "$tags"
}
,
{
"$group": {
"_id": '$tags',
"count": {"$sum": 1}
}
},
{"$sort": {"count": -1}},
{"$limit": 5}
]);