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

Mongodb Mongo查找对象内最长数组的查询,mongodb,Mongodb,我目前在mongo中为我的应用程序设置了如下对象(简化的示例,为了清晰起见,我删除了一些不相关的字段): 我想做的是运行一个find查询,返回数组长度在“l”下最高的对象,并对highest->lowest进行排序,最多25个结果。有些对象在数组中可能有1个对象,有些对象可能有100个。我想知道在“l”下哪一个最有吸引力。我是mongo的新手,在这之前还需要做其他的工作,但我就是无法找到正确的参数来获得这个特定的查询。我感到困惑的是如何计算数组的长度、排序等。我可以通过解析集合中的所有内容来手动

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

我想做的是运行一个find查询,返回数组长度在“l”下最高的对象,并对highest->lowest进行排序,最多25个结果。有些对象在数组中可能有1个对象,有些对象可能有100个。我想知道在“l”下哪一个最有吸引力。我是mongo的新手,在这之前还需要做其他的工作,但我就是无法找到正确的参数来获得这个特定的查询。我感到困惑的是如何计算数组的长度、排序等。我可以通过解析集合中的所有内容来手动编写代码,但我确信mongo必须有一种方法来更有效地完成这项工作。我并不反对学习,如果有人知道更多高级查询的资源或可以帮助我,我真的非常感谢,因为这是最后一篇文章!:-)


顺便说一句,node.js和mongo结合在一起真是太棒了,我希望我很久以前就开始结合使用它们了。

在现有的模式中没有简单的方法可以做到这一点。原因是mongodb中没有找到数组长度的大小。是的,您有运算符,但它的工作方式只是查找特定长度的所有数组

因此,您不能根据数组的长度对find查询进行排序。唯一合理的解决方法是向模式中添加额外的字段,该字段将保存数组的长度(在每个文档的字段中,都会添加类似“l_length:3”的内容)。好的方面是,通过查看这个,您可以很容易地做到这一点,在这之后,您只需要确保在修改数组时增加或减少这个值


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

使用聚合框架。以下是方法:

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

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

您可以尝试使用
$size
在文档中添加大小字段

  • $addFields
    添加新字段
    total
    获取
    l
    数组中的元素总数
  • $sort
    total
    降序排列
  • $limit
    选择单个文档
  • $project
    删除不需要的
    total
    字段

谢谢!正是我需要的。我认为聚合是正确的方法,但不确定如何正确地利用它。非常感谢:-)
db.collection.aggregate( [
  { $unwind : "$l" },
  { $group : { _id : "$_id", len : { $sum : 1 } } },
  { $sort : { len : -1 } },
  { $limit : 25 }
] )
db.collection.aggregate([
  { $addFields: { total: { $size: "$l" } } },
  { $sort: { total: -1 } },
  { $limit: 25 }
  // { $project: { total: 0 } }
])