Mongoose:如何使用聚合并一起查找

如何在Mongoose中同时使用聚合和find
i、 e我有以下模式:

const schema=new Mongoose.schema({
已创建:{type:Date,默认值:Date.now()},
名称:{type:String,默认值:'development'}
追随者:[{type:Mongoose.Schema.ObjectId,ref:'Users'}]
...
})
导出默认Mongoose.model('Locations',schema)

如何仅使用namefollowers\u count字段查询用户
followers\u count:追随者的长度

在那里,我知道我们可以使用select仅获取字段名称
我们如何获得追随者的数量

对于MongoDB 3.6及更高版本,请使用允许在查询语言中使用聚合表达式的$expr运算符:

var\u count=30;
db.locations.find({
“$expr”:{
“$and”:[
{“$eq”:[“$name”,“development”]},
{“$gte”:[{“$size”:“$followers”},followers\u count]}
]
}
});

对于不兼容的版本,您可以使用$match$redact管道查询您的收藏。例如,如果要查询名称为“开发”且followers\u count大于30的locations集合,请运行以下聚合操作:

const followers\u count=30;
地点.合计([
{“$match”:{“name”:“development”},
{
“$redact”:{
“$cond”:[
{“$gte”:[{“$size”:“$followers”},followers_count]},
“$$KEEP”,
“$$PRUNE”
]
}
}
]).exec((错误,位置)=&gt{
如果(错误)抛出错误;
控制台日志(位置);
})

或者在单个管道中作为

Locations.aggregate([
{
“$redact”:{
“$cond”:[
{ 
“$and”:[
{“$eq”:[“$name”,“development”]},
{“$gte”:[{“$size”:“$followers”},followers\u count]}
]
},
“$$KEEP”,
“$$PRUNE”
]
}
}
]).exec((错误,位置)=&gt{
如果(错误)抛出错误;
控制台日志(位置);
})

以上内容将仅返回用户提供的\u id参考的位置。要返回用户文档作为“填充”followers数组的手段,您可以添加$lookup管道


如果基础Mongo服务器版本为3.4及更新版本,则可以按以下方式运行管道:

让追随者计数=30;
地点.合计([
{“$match”:{“name”:“development”},
{
“$redact”:{
“$cond”:[
{“$gte”:[{“$size”:“$followers”},followers_count]},
“$$KEEP”,
“$$PRUNE”
]
}
},
{
“$lookup”:{
“发件人”:“用户”,
“localField”:“followers”,
“外域”:“\u id”,
“作为”:“追随者”
}
}
]).exec((错误,位置)=&gt{
如果(错误)抛出错误;
控制台日志(位置);
})

否则,在应用<lookup之前,您需要<unwind<followers数组,然后使用<group管道重新分组:

让追随者计数=30;
地点.合计([
{“$match”:{“name”:“development”},
{
“$redact”:{
“$cond”:[
{“$gte”:[{“$size”:“$followers”},followers_count]},
“$$KEEP”,
“$$PRUNE”
]
}
},
{“$unwind”:“$followers”},
{
“$lookup”:{
“发件人”:“用户”,
“localField”:“followers”,
“外域”:“\u id”,
“作为”:“跟随者”
}
},
{“$unwind”:“$follower”},
{
“$group”:{
“\u id”:“$\u id”,
“已创建”:{“$first”:“$created”},
“名称”:{“$first”:“$name”},
“followers”:{“$push”:“$follower”}
}
}
]).exec((错误,位置)=&gt{
如果(错误)抛出错误;
控制台日志(位置);
})

发表评论