【问题标题】:Aggregation of different collections in MongoDBMongoDB中不同集合的聚合
【发布时间】:2021-05-09 00:40:22
【问题描述】:

不知道该怎么做,有 SQL 的背景,在那里完成我需要做的事情要容易得多。

基本上我的收藏新闻是这样的:

const news = [
{id: '123123123', category: [ObjectID(12312312323), ObjectID(987987987)]},
{id: '123123123', category: []},
{id: '123123123', category: [ObjectID(987987987)]}
]

然后我有这样的集合类别:

const category = [
{name: "123a", _id: ObjectID(123123123}, title:"blah blah" },
{name: "987a", _id: ObjectID(987987987}, title:"blih blah" ,
]

我需要做的是加入两个表并获得类似的聚合

[
{name: "987a", title: "blih blah", count: 2},
{name: "123a", title: "blah blah", count: 1}
 
]

所以即使在 MySQL 中,我也会得到类似于:

SELECT name, title, count(Select count(category) from news) from categories 

但我无法通过 mongoDb / mongoose 获得它。

【问题讨论】:

  • 这能回答你的问题吗? count of $lookup result mongodb
  • 不,这不是我真正需要的。我需要计算类别数组中 ID 的出现次数,而不是进行内连接,否则查询会变慢。 ps:那个答案应该修改了……
  • 你不能使用populate来获取大小,你必须使用聚合方法,看我的回答。
  • 是的,你是对的。我在查询错误的集合。谢谢你的提示!

标签: node.js mongodb mongoose


【解决方案1】:
  • $lookup 加入 news 集合,传递 _id 作为 localField 和 category 作为 foreignField
  • $size 获取新集合结果的总元素 count
db.category.aggregate([
  {
    $lookup: {
      from: "news",
      localField: "_id",
      foreignField: "category",
      as: "count"
    }
  },
  { $set: { count: { $size: "$count" } } }
])

Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2017-03-14
    • 2023-03-31
    相关资源
    最近更新 更多