mongoose:如何使用聚合和一起find

我如何在Mongoose中使用聚合和一起find
即我有以下架构:

 const schema = new Mongoose.Schema({ created: { type: Date, default: Date.now() }, name: { type: String, default: 'development' } followers: [{ type: Mongoose.Schema.ObjectId, ref: 'Users'}] ... }) export default Mongoose.model('Locations', schema) 

我如何查询只有字段namefollowers_count
followers_countfollowers_count的长度。

在那里,我知道我们可以使用select来只获取字段name
我们怎么能得到followers的数量?

您可以使用$match$redactpipe道来查询您的集合。 例如,如果要查询名称为“development”且followers_count大于30的locations集合,请运行以下集合操作:

 let followers_count = 30; Locations.aggregate([ { "$match": { "name": "development" } }, { "$redact": { "$cond": [ { "$gte": [ { "$size": "$followers" }, followers_count ] }, "$$KEEP", "$$PRUNE" ] } } ]).exec((err, locations) => { if (err) throw err; console.log(locations); }) 

以上将仅返回来自用户的_id引用的位置。 要返回用户文档作为“填充”追随者数组的手段,可以追加$lookuppipe道。


如果底层的Mongo服务器版本是3.4或者更新,你可以运行pipe道

 let followers_count = 30; Locations.aggregate([ { "$match": { "name": "development" } }, { "$redact": { "$cond": [ { "$gte": [ { "$size": "$followers" }, followers_count ] }, "$$KEEP", "$$PRUNE" ] } }, { "$lookup": { "from": "users", "localField": "followers", "foreignField": "_id", "as": "followers" } } ]).exec((err, locations) => { if (err) throw err; console.log(locations); }) 

否则,您需要在应用$lookup之前$unwind跟随者数组,然后使用$grouppipe道重新组合:

 let followers_count = 30; Locations.aggregate([ { "$match": { "name": "development" } }, { "$redact": { "$cond": [ { "$gte": [ { "$size": "$followers" }, followers_count ] }, "$$KEEP", "$$PRUNE" ] } }, { "$unwind": "$followers" }, { "$lookup": { "from": "users", "localField": "followers", "foreignField": "_id", "as": "follower" } }, { "$unwind": "$follower" }, { "$group": { "_id": "$_id", "created": { "$first": "$created" }, "name": { "$first": "$name" }, "followers": { "$push": "$follower" } } } ]).exec((err, locations) => { if (err) throw err; console.log(locations); }) 

您可以使用如下:

 db.locations.aggregate([ {$match:{"your find query"}}, {$project:{"your desired fields"}} ]) 

在比赛中,你可以做这样的事情:

 {{$match:{name:"whatever"}} 

在项目中,您可以使用数字0或1来select所需的字段:

 {$project:{_id:1,created:0,name:1}} 

其中0表示不放,1表示放。