gpt4 book ai didi

MongoDB 聚合文档返回计数或 0

转载 作者:行者123 更新时间:2023-12-05 02:08:21 25 4
gpt4 key购买 nike

我有以下聚合查询:

db.user.aggregate()
.match({"business_account_id" : ObjectId("5e3377bcb1dbae5124e4b6bf")})
.lookup({
'localField': 'profile_id',
'from': 'profile',
'foreignField' : '_id',
'as': 'profile'
})
.unwind("$profile")
.match({"profile.type" : "consultant"})
.group({_id:"$business_account_id", count:{$sum:1}})

我的目标是计算有多少顾问用户属于给定公司。

使用上面的查询,如果至少有一个用户属于所提供的 business_account_id,我会得到一个正确的计数值。

但如果没有用户,.match({"business_account_id": ObjectId("5e3377bcb1dbae5124e4b6bf")}) 将返回空(0 个文档)结果。

如果没有用户分配给公司,我如何获得 count: 0

我尝试了很多基于其他线程的方法,但我找不到 count: 0

更新 1

我的问题的一个简单版本:

用户合集

{
"_id" : ObjectId("5e36beb7b1dbae5124e4b6dc"),
"business_account_id" : ObjectId("5e3377bcb1dbae5124e4b6bf"),
},
{
"_id" : ObjectId("5e36d83db1dbae5124e4b732"),
"business_account_id" : ObjectId("5e3377bcb1dbae5124e4b6bf"),
}

使用以下聚合查询:

db.getCollection("user").aggregate([
{ "$match" : {
"business_account_id" : ObjectId("5e3377bcb1dbae5124e4b6bf")
}
},
{ "$group" : {
"_id" : "$business_account_id",
"count" : { "$sum" : 1 }
}
}
]);

我得到:

{ 
"_id" : ObjectId("5e3377bcb1dbae5124e4b6bf"),
"count" : 2
}

但是如果我查询一个不存在的ObjectId,比如:

db.getCollection("user").aggregate([
{ "$match" : {
"business_account_id" : ObjectId("5e335c873e8d40676928656d")
}
},
{ "$group" : {
"_id" : "$business_account_id",
"count" : { "$sum" : 1 }
}
}
]);

我得到的结果完全是空的。我希望得到:

{ 
"_id" : ObjectId("5e335c873e8d40676928656d"),
"count" : 0
}

最佳答案

问题的根源是如果 user 集合中没有满足初始 $match 的文档,则没有任何内容可以传递到管道的下一阶段.如果 business_account_id 实际上存在于某处(也许是另一个集合?),则针对该集合运行聚合,以便初始匹配至少找到一个文档。然后使用 $lookup 查找用户。如果您使用的是 MongoDB 3.6+,您可以结合用户和配置文件查找。最后,使用 $size 来计算 users 数组中的元素。

(您可能需要调整集合和字段名称)

db.businesses.aggregate([
{$match:{_id : ObjectId("5e3377bcb1dbae5124e4b6bf")}},
{$project: { _id:1 }},
{$lookup:{
from: "users",
let: {"busId":"$_id"},
as: "users",
pipeline: [
{$match: {$expr:{$eq:[
"$$busId",
"$business_account_id"
]}}},
{$lookup:{
localField: "profile_id",
from: "profile",
foreignField : "_id",
as: "profile"
}},
{$match: { "profile.type" : "consultant"}}
]
}},
{$project: {
_id: 0,
business_account_id: "$_id",
count:{$size:"$users"}
}}
])

Playground

关于MongoDB 聚合文档返回计数或 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61047902/

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