【问题标题】:Mongo find query for longest arrays inside objectMongo查找对象内最长数组的查询
【发布时间】:2021-05-14 22:33:23
【问题描述】:

我目前在 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 一起使用非常棒,我希望我很久以前就开始将它们结合使用。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!正是我需要的。我认为聚合是正确的方法,但不确定如何正确使用它。非常感谢:-)
    【解决方案2】:

    使用现有架构没有简单的方法可以做到这一点。这样做的原因是 mongodb 中没有任何东西可以找到数组长度的大小。是的,您有 $size 运算符,但它的工作方式只是查找特定长度的所有数组。

    因此您不能根据数组的长度对查找查询进行排序。唯一合理的方法是向您的架构添加额外的字段,该字段将保存数组的长度(您将在每个文档的字段之外添加类似“l_length:3”的内容)。好消息是您可以通过查看此relevant answer 轻松完成此操作,之后您只需确保在修改数组时增加或减少此值。

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

    【讨论】:

      【解决方案3】:

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

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

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

      Playground

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-08
        • 2014-06-03
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 1970-01-01
        • 2016-12-28
        相关资源
        最近更新 更多