Mongoose在$ group之前展开$ $
我有很多难以解决这个mongodb(mongoose)的问题。
有模式Guess
( _id
, title
, tags
)与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);
文档示例:
{ "_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") ] } ...... .....
我需要获得最受欢迎的标签(标签)列表。 上面我向您展示架构和我的解决schememongoose查询。
Guess.aggregate([ { "$project": { "_id": 1, "tags": 1 } }, { "$unwind": "$tags" } // , // { // "$group": { // "tags": '$tags.tags', // "count": {"$sum": 1} // } // }, // {"$sort": {"count": -1}}, // {"$limit": 5} ], function (error, result) { // });
如果我评论这个选项
{ "$group": { "tags": '$tags.tags', "count": {"$sum": 1} } }, {"$sort": {"count": -1}}, {"$limit": 5}
然后我的查询结果是
[ { _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 } ]
我取消注释,然后这个查询错误。 我想要组tag
并显示5个最受欢迎的标签。 如何解决它?
我想要的结果看起来像
[ { tags: 578857529507cafd5fe1f9b6, count: 10 }, { tags: 578857529507cafd5fe1f9b7, count: 9 }, { tags: 578854779507cafd5fe1f9a6, count: 8 }, { tags: 578854779507cafd5fe1f9a5, count: 5 }, { tags: 5788570d9507cafd5fe1f9b0, count: 2 } ]
在你的$小组阶段,你需要指定一个_id。 这是强制性的,将是关键的组。 所以基本上你需要改变
{ "$group": { "tags": '$tags.tags', "count": {"$sum": 1} } }
至
{ "$group": { "_id": '$tags', "count": {"$sum": 1} } }
所以完整的pipe道将是:
Guess.aggregate([ { "$project": { "_id": 1, "tags": 1 } }, { "$unwind": "$tags" } , { "$group": { "_id": '$tags', "count": {"$sum": 1} } }, {"$sort": {"count": -1}}, {"$limit": 5} ]);
- 在nodejs中的Mongodb Tailable Cursor,如何停止stream
- 如何用mongoose排除数组types的字段
- 保存/devise嵌套forms,根据mongoose模式,通过mongoose在mongodb中保存/更新数据
- 嵌套模式字段上的Mongoose文本索引
- 如何将多个POSTparameter passing给mongodb并获得匹配结果
- 在第一个参数中将variables传递给mongoose中的查询
- Node.js + mongoose
- Nodejs / Express – 启动我的应用程序:express.createServer()已弃用
- 尝试覆盖input区域中的预填充数据