检索MongoDB中列表的长度

Leo*_*opd 3 mongodb

我正在尝试进行mongo查询,我在每个文档中获取数组的长度,而不检索列表的完整内容.理想情况下,这将是这些行的投影选项:

db.log.find({},{entries:{$length: 1}})
Run Code Online (Sandbox Code Playgroud)

但这不受支持.也许这可以通过新的聚合框架以优雅的方式实现?我想出的是:

db.log.find({},{"entries.length": 1})
Run Code Online (Sandbox Code Playgroud)

返回结果如下:

{ "_id" : ObjectId("50d2fb07e64cfa55431de693"), "entries" : [   {    },     {    },     {    },     {    },     {    },     {    },     {    },     {  },   {    },     {    },     {    },     {    },     {    },     {  },   {    },     {    },     {    },     {    } ] }
Run Code Online (Sandbox Code Playgroud)

这很难看,但基本上可以满足我的需求,因为我可以计算这个列表的长度而不需要获取全部内容的网络权重.但我不知道为什么会这样.这个查询到底在做什么?

小智 5

现在,我可以用两种方法思考:

1)使用聚合框架:

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

2)或者您可以在包含条目计数的文档中添加字段.因此,每次将新值推送到entries数组时,都必须递增计数器.更新将如下所示:

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

显然,你在这里需要权衡:聚合框架对于这个简单的操作而言过于昂贵.但是在文档中添加一个字段,每次更新都应该增加计数器.

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