查询MongoDB中的内部数组大小

时间:2011-07-17 09:04:07

标签: mongodb nosql

考虑users集合中的MongoDB文档:

{ username : 'Alex', tags: ['C#', 'Java', 'C++'] }

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

谢谢!

6 个答案:

答案 0 :(得分:29)

如果用户名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 }

答案 1 :(得分:16)

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

您也可以使用map / reduce(canonical example)执行此操作,但这似乎不是您想要的。

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

> db.collection.find({ tags : { $size: 3 }});

那将为您提供包含3个标签的所有文件......

答案 2 :(得分:16)

现在MongoDB(2.6版本)supports $size聚合操作。

来自文档:

{ <field>: { $size: <array> } }

您可以通过以下方式完成您想要的任务:

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

db.users.aggregate(
   [
      {
         $project: {
            tags_count: {$size: "$tags"}
         }
      }
   ]
)

答案 3 :(得分:10)

xmm.dev的答案可以简化:不是让interm字段'count',而是直接在$ group中汇总:

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

答案 4 :(得分:9)

目前,唯一的方法是使用db.eval,但locks database for other operations

最节省速度的方法是添加一个额外的字段来存储数组的长度 通过$inc$push操作维护它。

答案 5 :(得分:0)

我做了一个小小的工作,因为我需要查询数组大小并返回它是否大于0但可以是1-3的任何内容。

这是我的解决方案:

db.test.find($or : [{$field : { $exists : true, $size : 1}},
                    {$field : { $exists : true, $size : 2}},
                    {$field : { $exists : true, $size : 3}}, ])

当属性存在且大小为1,2或3时,这基本上返回文档。如果用户正在查找特定大小或在范围内,则可以添加更多语句和增量。我知道它并不完美,但确实有效并且速度相对较快。我的属性中只有1-3个大小,所以这个解决方案有效。