如何在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)
如何仅使用name
和followers\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((错误,位置)=>{
如果(错误)抛出错误;
控制台日志(位置);
})
或者在单个管道中作为
Locations.aggregate([
{
“$redact”:{
“$cond”:[
{
“$and”:[
{“$eq”:[“$name”,“development”]},
{“$gte”:[{“$size”:“$followers”},followers\u count]}
]
},
“$$KEEP”,
“$$PRUNE”
]
}
}
]).exec((错误,位置)=>{
如果(错误)抛出错误;
控制台日志(位置);
})
以上内容将仅返回用户提供的\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((错误,位置)=>{
如果(错误)抛出错误;
控制台日志(位置);
})
否则,在应用<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((错误,位置)=>{
如果(错误)抛出错误;
控制台日志(位置);
})