因此,我在 MongoDB 集合中拥有一堆文档,并且似乎集合的增长速度比我们想象的要快一些。
有没有办法从集合中获取一个列表,该列表将计算出字段中值为 X 的文档的数量。
为了举例子,我仅编造一些数据:
该字段有 4 个可能的值reference
:
/content/public
/content/private
/resource/something
/much/wow
有没有办法从 mongo 获取以下列表:
- 1231 记录具有
/content/public
参考价值。 - 21312312有
/content/private
。 - 34有
/resource/something
。 - 34242 有
/much/wow
。
答案1
有几种不同的方法可以做到这一点,蛮力的方法是针对您知道的每个不同值进行查询,然后像.count()
这样调用:
db.collection.find({field : '/content/public'}).count()
db.collection.find({field : '/content/private'}).count()
etc.
但这意味着您需要遍历已知字段列表,并且必须运行一系列不同的查询。不过,对于抽查来说,这可能是不错的选择。
更普遍的选择是聚合框架类似这样的操作会起作用,其中如上所示的字段是您感兴趣的计数值:
db.collection.aggregate( { $group : { _id : "$field", count : { $sum : 1 } } })
以下是使用虚构数据的通用示例。首先是数据本身:
> db.foo.find()
{ "_id" : ObjectId("547ccf922bd17c324ae52b6e"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf932bd17c324ae52b6f"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf942bd17c324ae52b70"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf942bd17c324ae52b71"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf952bd17c324ae52b72"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf962bd17c324ae52b73"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf9b2bd17c324ae52b74"), "countField" : "/content/private" }
{ "_id" : ObjectId("547ccf9d2bd17c324ae52b75"), "countField" : "/content/private" }
{ "_id" : ObjectId("547ccfa42bd17c324ae52b76"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfa52bd17c324ae52b77"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfa62bd17c324ae52b78"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfa72bd17c324ae52b79"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfa72bd17c324ae52b7a"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfa82bd17c324ae52b7b"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfb52bd17c324ae52b7c"), "countField" : "/much/wow" }
现在样本汇总:
> db.foo.aggregate({ $group : { _id : "$countField", count : { $sum : 1 } } })
{ "_id" : "/much/wow", "count" : 1 }
{ "_id" : "randomvalue", "count" : 6 }
{ "_id" : "/content/private", "count" : 2 }
{ "_id" : "/content/public", "count" : 6 }