首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找对象内最长数组的查询

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

Stack Overflow用户
提问于 2013-11-24 02:14:27
回答 3查看 3.8K关注 0票数 18

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

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

我想要做的是运行一个find查询,返回在"l“下具有最高数组长度的对象,并对最高->最低的对象进行排序,限制为25个结果。有些对象可能在数组中有一个对象,有些对象可能有100个。我想知道那些在"l“下面的人最多。我对mongo很陌生,在此之前,其他的东西都要处理,但我只是找不出正确的参数来获得这个特定的查询。我感到困惑的是如何处理数组的长度、排序等等。我可以通过解析集合中的所有内容来手动编写这段代码,但我确信,mongo必须有一种更有效的方法来做到这一点。我不反对学习,如果有人知道更高级查询的任何资源,或者可以帮助我,我真的很感激,因为这是最后一块!:)

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-24 09:40:09

使用聚合框架。下面是操作步骤:

代码语言:javascript
复制
db.collection.aggregate( [
  { $unwind : "$l" },
  { $group : { _id : "$_id", len : { $sum : 1 } } },
  { $sort : { len : -1 } },
  { $limit : 25 }
] )
票数 23
EN

Stack Overflow用户

发布于 2013-11-24 02:30:11

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

因此,不能根据数组的长度对查找查询进行排序。唯一合理的出路是向模式中添加额外的字段,这将保留数组的长度(除了每个文档的字段外,还有类似于"l_length : 3“的内容)。好的是,您可以通过查看这个相关答案轻松地完成它,在此之后,您只需要确保在修改数组时增加或减少这个值。

当您添加这个字段时,您可以很容易地根据该字段对其进行排序,而且还可以利用索引。

票数 2
EN

Stack Overflow用户

发布于 2021-05-14 14:33:23

没有直接的方法来做这件事,

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

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

游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20170309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档