从 MongoDB 中按字段的数量和唯一性排序的集合中获取记录列表

从 MongoDB 中按字段的数量和唯一性排序的集合中获取记录列表

因此,我在 MongoDB 集合中拥有一堆文档,并且似乎集合的增长速度比我们想象的要快一些。

有没有办法从集合中获取一个列表,该列表将计算出字段中值为 X 的文档的数量。

为了举例子,我仅编造一些数据:

该字段有 4 个可能的值reference

  1. /content/public
  2. /content/private
  3. /resource/something
  4. /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 }

相关内容