按引用文档属性列出的MongoDB计数
db.foos db.bar按引用文档属性列出的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:
如何以最简单的方式找到引用“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
}