2012-12-19 50 views
3

我试图做一个mongo查询,在这里我得到了每个文档中数组的长度,而没有检索列表的全部内容。理想情况下,这将是沿着这些线的投影选项:在MongoDB中检索列表的长度

db.log.find({},{entries:{$length: 1}}) 

但是这不被支持。也许这可以用新的聚合框架以优雅的方式进行?我想出来的是这样的:

db.log.find({},{"entries.length": 1}) 

它返回这样的结果:

{ "_id" : ObjectId("50d2fb07e64cfa55431de693"), "entries" : [ { },  { },  { },  { },  { },  { },  { },  { }, { },  { },  { },  { },  { },  { }, { },  { },  { },  { } ] } 

这是丑陋的,但基本上我的服务需求,因为我可以算这个列表的长度没有网络获得完整内容的重量。但我不知道为什么这会起作用。这个查询究竟在做什么?现在

+0

我相信这是返回数组中的每个元素的'length'场 - 因为这大概不是为任何人设置,您会为数组的每个元素获得一个空对象。 – drevicko

回答

5

,我能想到的两种技术途径:

1)使用聚合框架:

db.log.aggregate([ { $unwind : "$entries" }, { $group : { _id : "$_id", entries : {$sum:1} } } ]); 

2),或者你可以添加一个字段来保存条目数文档。因此,每次您向条目数组推送新值时,都必须递增计数器。该更新将是这样的:

db.log.update({ _id : 123 }, { $push : { entries : 'value' }, $inc : { entriesCount : 1 } }) 

显然,你有一个权衡这里:聚合框架是这样简单的操作过于昂贵。但是为文档添加一个字段,每次更新都应该增加计数器。

恕我直言,计数器看起来更合理,但它看起来是一种解决方法。