MongoDb : 在没有连接操作的情况下计算其他集合中的文档
MongoDb : count documents in other collection without a join operation
我有 2 个合集:
公会:
{
name: { type: String },
owner: { type: String },
discord: {
id: { type: String }
}
}
日志命令:
{
discordId: { type: String },
guild: { type: String },
name: { type: String },
}
我写了一个函数来获取一个所有者的所有公会,并为每个公会计算与该公会相关的日志总和。
函数:
Guild.aggregate([
{
$match: {
owner: ObjectId(userId),
},
},
{
$lookup: {
from: 'logcommands',
localField: 'discord.id',
foreignField: 'guild',
as: 'logs',
},
},
{ $addFields: { commandCount: { $size: '$logs' } } },
]);
这是可行的,但我不希望 mongoDB 检索所有相关的 logCommand(为了提高性能),我只想要每个公会的日志计数,无需执行连接操作 ($lookup) ?
感谢您的帮助!
查询
- 你可以使用管道查找,查找结果只有计数
- 波纹管需要MongoDB 5,localfield和foreignfield与你的查找相同,除了小管道只是为了计数
- 经过查找,
$set
稍微改变了结构。
Guild.aggregate(
[{"$match":{"owner":1}},
{"$lookup":
{"from":"logcommands",
"localField":"discord.id",
"foreignField":"guild",
"pipeline":[{"$count":"count"}],
"as":"logs"}},
{"$set":{"logs":{"$arrayElemAt":["$logs.count", 0]}}}])
我有 2 个合集:
公会:
{
name: { type: String },
owner: { type: String },
discord: {
id: { type: String }
}
}
日志命令:
{
discordId: { type: String },
guild: { type: String },
name: { type: String },
}
我写了一个函数来获取一个所有者的所有公会,并为每个公会计算与该公会相关的日志总和。
函数:
Guild.aggregate([
{
$match: {
owner: ObjectId(userId),
},
},
{
$lookup: {
from: 'logcommands',
localField: 'discord.id',
foreignField: 'guild',
as: 'logs',
},
},
{ $addFields: { commandCount: { $size: '$logs' } } },
]);
这是可行的,但我不希望 mongoDB 检索所有相关的 logCommand(为了提高性能),我只想要每个公会的日志计数,无需执行连接操作 ($lookup) ?
感谢您的帮助!
查询
- 你可以使用管道查找,查找结果只有计数
- 波纹管需要MongoDB 5,localfield和foreignfield与你的查找相同,除了小管道只是为了计数
- 经过查找,
$set
稍微改变了结构。
Guild.aggregate(
[{"$match":{"owner":1}},
{"$lookup":
{"from":"logcommands",
"localField":"discord.id",
"foreignField":"guild",
"pipeline":[{"$count":"count"}],
"as":"logs"}},
{"$set":{"logs":{"$arrayElemAt":["$logs.count", 0]}}}])