按引用文档属性列出的MongoDB计数

按引用文档属性列出的MongoDB计数,mongodb,count,aggregation-framework,Mongodb,Count,Aggregation Framework,db.foos db.bar 如何以最简单的方式找到引用“wine”类型的bar文档的foo文档数?即使集合中应该包含大量文档,也希望能够扩展到性能相当好的集合。尝试此聚合框架查询: db.foos.aggregate([ {$lookup: { from: "bars", localField: "_id", foreignField: "_id", as: "docs" } }, {$unwind:

db.foos

db.bar


如何以最简单的方式找到引用“wine”类型的bar文档的foo文档数?即使集合中应该包含大量文档,也希望能够扩展到性能相当好的集合。

尝试此聚合框架查询:

db.foos.aggregate([
   {$lookup:
     {
       from: "bars",
       localField: "_id",
       foreignField: "_id",
       as: "docs"
     }
   },
   {$unwind: "$docs"},
   {$match: {"docs.type":"wine"}},
   {$group: {"_id":"$_id", count: {$sum:1}}}
]
)
我在这些文档上进行了测试:

db.foos.insert({"_id":"123"})
db.foos.insert({"_id":"456"})

db.bars.insert({"_id":"123", type:"wine"})
db.bars.insert({"_id":"456", type:"beer"})
对于葡萄酒类型,我得到的结果是:

{ 
    "_id" : "123", 
    "count" : 1
}

实际上,您只能使用
$lookup
,这将增加“连接”的开销。您的“真实”用例中是否有更多的数据可以用于在单个集合上执行此操作?我的答案不是解决方案,而是我认为使用MongooseJSODM的简单方法。有了此库帮助,您将能够尽快使用mongoDB执行所有操作。@Levon这确实不是一个解决方案,因为mongoose
.populate()
实际上运行“多个”查询以模拟“连接”的外观。这实际上比
$lookup
更糟糕。理想情况下,常规查询操作“应该”根本不需要连接。要么嵌入数据,要么包含允许充分过滤的数据。所以,如果这只是一个意见,没有真正添加任何东西,那么它甚至不应该是一个评论。谢谢!知道大型数据集上是否会出现性能问题吗?我只是从以前的大量SQL连接的经验中询问,希望避免在数据开始增长时重写聚合函数。@henit我知道的唯一建议是在“foreignField”上创建索引,但在您的例子中是id,因此它是按定义索引的。这里的问题可能是每个foos文档可以有多少条对象?如果这个基数很小,您可以在foos文档中修改嵌入bar文档的设计,并避免连接
db.foos.insert({"_id":"123"})
db.foos.insert({"_id":"456"})

db.bars.insert({"_id":"123", type:"wine"})
db.bars.insert({"_id":"456", type:"beer"})
{ 
    "_id" : "123", 
    "count" : 1
}