Javascript mongoose-聚合数据
我正试图找出如何使用Javascript mongoose-聚合数据,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我正试图找出如何使用聚合和mongoose,代码如下: const Model = db.model(which, schema) var regex = new RegExp(name, "g") const query = Model .find({ name: regex }) .where("user_id").equals(req.sessio
聚合和mongoose,代码如下:
const Model = db.model(which, schema)
var regex = new RegExp(name, "g")
const query =
Model
.find({
name: regex
})
.where("user_id").equals(req.session.user.id)
if (except)
{
if (Array.isArray(except))
{
query
.where("_id").nin(except)
}
else
{
query
.where("_id").neq(except)
}
}
return await
query
.skip(start)
.limit(finish)
.lean()
.exec()
我想做的是得到总数(不受限制)。当然,我可以删除skip
和limit
并使用count
,然后再次运行它,但我认为聚合在这种情况下是合适的?您可以尝试下面的聚合
db.collection.aggregate([
{ "$facet": {
"data": [
{ "$match": {
"name": { "$regex": name },
"user_id": mongoose.Types.ObjectId(req.session.user.id),
"_id": { "$nin": except }
}},
{ "$skip": start },
{ "$limit": finish }
],
"count": [
{ "$match": {
"name": { "$regex": name },
"user_id": mongoose.Types.ObjectId(req.session.user.id),
"_id": { "$nin": except }
}},
{ "$count": "count" }
]
}}
])
要执行一次(链),请执行以下操作:
这里什么是除了
?@AnthonyWinzlet除了
就是一个字符串或一个数组,应该是一个单数id或一个要排除的id列表,仅此而已。应该将其强制放入数组中,这样我就可以在nin
中使用它。我可能会在以后将此标记为答案,因为我仍在进行测试设置,以便可以自动执行一些测试插入。这只是部分答案。我还想做一个总计
,因此涉及到$count
的东西,您必须使用$facet
聚合。。。更新了答案是否在匹配部分使用$project
保存重复代码?否您不能。。。两者都是不同的操作“数据”和“数据计数”。。。但它不会影响你的表现
Model
.aggregate()
.match({
"name": { "$regex": name },
"user_id": ObjectId(req.session.user.id),
"_id": { "$nin": except }
})
.facet({
"results": [
{ "$skip": start },
{ "$limit": finish },
{
"$project": {
"map_levels": 0,
"template": 0
}
}
],
"count": [
{ "$count": "total" },
]
})
.exec()