Mongo查找对象内最长数组的查询

时间:2013-11-24 02:14:27

标签: mongodb

我目前在我的应用程序中为mongo设置了这样的对象(简化示例,为了清楚起见,我删除了一些不相关的字段):

{
    "_id" : ObjectId("529159af5b508dd71500000a"),
    "c" : "somecontent",
    "l" : [
        {
            "d" : "2013-11-24T01:43:11.367Z",
            "u" : "User1"
        },
        {
            "d" : "2013-11-24T01:43:51.206Z",
            "u" : "User2"
        }
     ]
}

我想要做的是运行查询查询以返回在“l”下具有最高数组长度的对象,并将最高 - >最低,排序限制为25个结果。有些对象可能在数组中有1个对象,有些可能有100个。我想找出哪些对象在“l”下最多。我是mongo的新手,并且到目前为止还得到了其他所有工作,但我无法找出正确的参数来获得这个特定的查询。我感到困惑的是如何处理计算数组的长度,排序等。我可以通过解析集合中的所有内容来手动编码,但我确信mongo必须有一种方法来做到这一点。更有效率。我不反对学习,如果有人知道任何更高级的查询资源或者可以帮助我,我真的很感激,因为这是最后一块! : - )

作为旁注,node.js和mongo在一起很棒,我希望我很久以前就开始使用它们了。

3 个答案:

答案 0 :(得分:16)

使用聚合框架。方法如下:

db.collection.aggregate( [
  { $unwind : "$l" },
  { $group : { _id : "$_id", len : { $sum : 1 } } },
  { $sort : { len : -1 } },
  { $limit : 25 }
] )

答案 1 :(得分:1)

使用现有架构没有简单的方法。原因是mongodb中没有任何内容可以找到数组长度的大小。是的,你有$size运算符,但它的工作方式只是找到特定长度的所有数组。

因此,您无法根据数组的长度对查询查询进行排序。唯一合理的方法是在模式中添加额外的字段,该字段将保存数组的长度(对于每个文档,除了字段之外,还有“l_length:3”之类的东西)。好的是你可以通过查看这个relevant answer轻松地完成它,之后你只需要确保在修改数组时增加或减少这个值。

当您添加此字段时,您可以轻松地按该字段对其进行排序,而且您可以利用索引。

答案 2 :(得分:0)

没有直接的方法可以做到这一点,

您可以尝试使用 $size,

在文档中添加大小字段
  • $addFields 添加新字段 total 以获取 l 数组中的总元素
  • $sorttotal 降序排列
  • $limit 选择单个文档
  • $project 在不需要时删除 total 字段
db.collection.aggregate([
  { $addFields: { total: { $size: "$l" } } },
  { $sort: { total: -1 } },
  { $limit: 25 }
  // { $project: { total: 0 } }
])

Playground