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稍微改变了结构。

Test code here

Guild.aggregate(
[{"$match":{"owner":1}},
 {"$lookup":
  {"from":"logcommands",
   "localField":"discord.id",
   "foreignField":"guild",
   "pipeline":[{"$count":"count"}],
   "as":"logs"}},
 {"$set":{"logs":{"$arrayElemAt":["$logs.count", 0]}}}])