查询MongoDB中的内部数组大小

Zau*_*bov 40 mongodb nosql

考虑users集合中的MongoDB文档:

{ username : 'Alex', tags: ['C#', 'Java', 'C++'] }
Run Code Online (Sandbox Code Playgroud)

有没有办法,tags从服务器端获取数组的长度(不将标签传递给客户端)?

谢谢!

xmm*_*dev 30

如果用户名Alex是唯一的,您可以使用下一个代码:

db.test.insert({username:"Alex", tags: ['C#', 'Java', 'C++'] });
db.test.aggregate(
  {$match: {username : "Alex"}}, 
  {$unwind: "$tags"},
  {$project: {count:{$add:1}}},
  {$group: {_id: null, number: {$sum: "$count" }}}
);
{ "result" : [ { "_id" : null, "number" : 3 } ], "ok" : 1 }
Run Code Online (Sandbox Code Playgroud)


anv*_*rik 17

现在MongoDB(2.6版本)支持 $size聚合操作.

从文档:

{ <field>: { $size: <array> } }
Run Code Online (Sandbox Code Playgroud)

通过使用以下内容,您可以完成以下任务:

db.users.aggregate(
   [
      {
         $group: {
            _id: "$username",
            tags_count:  {$first: {$size: "$tags" }}
         }
      }
   ]
)
Run Code Online (Sandbox Code Playgroud)

要么

db.users.aggregate(
   [
      {
         $project: {
            tags_count: {$size: "$tags"}
         }
      }
   ]
)
Run Code Online (Sandbox Code Playgroud)

  • 我不认为你可以像$ group那样使用$ size运算符.$ size不在[聚合运算符]之间(http://docs.mongodb.org/manual/reference/operator/aggregation-group/).相反,如果你不需要分组,你可以使用投影:db.test.aggregate({$ project:count:{$ size:"$ tags"}})或者如果你需要分组,就像这样:db.test .aggregate({$ group:{_ id:"$ userName",count:{$ sum:{$ size:"$ tags"}}}}}) (7认同)

Jus*_*ins 16

我认为使用$ inc计算每个保存(作为单独的字段)的标签数量可能更有效,或者通过计划中的作业来计算.

您也可以使用map/reduce(规范示例)执行此操作,但这似乎不是您想要的.

我不确定是否可以完全按照您的要求进行操作,但您可以使用$ size查询所有匹配特定大小的文档...

> db.collection.find({ tags : { $size: 3 }});
Run Code Online (Sandbox Code Playgroud)

那就是给你带来3个标签的所有文件......


Vol*_*kov 10

xmm.dev的答案可以简化:你可以直接在$ group中求和,而不是使用interm字段'count':

db.test.aggregate(
  {$match: {username : "Alex"}}, 
  {$unwind: "$tags"},
  {$group: {_id: null, number: {$sum: 1 }}}
) 
Run Code Online (Sandbox Code Playgroud)


pla*_*aes 9

目前,唯一的方法似乎是使用db.eval,但这会锁定数据库以进行其他操作.

最快速的方法是添加一个额外的字段,用于存储数组的长度并通过$ inc$ push操作维护它.