gpt4 book ai didi

node.js - Mongoose:如何一起使用聚合和查找

转载 作者:IT老高 更新时间:2023-10-28 13:05:58 26 4
gpt4 key购买 nike

如何使用 aggregatefind 一起在 Mongoose 中?
即我有以下架构:

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_count:followers 的长度。

在那里,我知道我们可以使用 select仅获取字段 name
我们如何获得 followers 的数量?

最佳答案

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

var followers_count = 30;
db.locations.find({
"$expr": {
"$and": [
{ "$eq": ["$name", "development"] },
{ "$gte": [{ "$size": "$followers" }, followers_count ]}
]
}
});

对于不兼容的版本,您可以同时使用 $match $redact 管道来查询您的收藏。例如,如果要查询名称为 'development' 且 followers_count 大于 30 的 locations 集合,请运行以下聚合操作:

const 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);
})

或在单个管道中作为

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

上面将返回仅包含来自用户的 _id 引用的位置。要返回用户文档作为“填充”关注者数组的方法,您可以附加 $lookup 管道。


如果底层 Mongo 服务器版本为 3.4 及更高版本,您可以将管道运行为

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);
})

否则你需要 $unwind 应用前的关注者数组 $lookup 然后与 $group 重新组合 之后的管道:

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);
})

关于node.js - Mongoose:如何一起使用聚合和查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42394902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com